单元测试void方法时,如何确定集合中的元素?

时间:2013-06-07 14:00:59

标签: java junit mockito

我有一个类似于

的void方法
public void handle(MyObject myObject) {
   Set<String> mySet = new HashSet<String>();
   mySet.addAll(myObject.getStuff();

   ...

   mySet.addAll(someOtherList);

   ...

   myService.doSomething(mySet);
}

我正在使用Mockito。我已经模拟了myService,并且我正在验证myService.doSomething(mySet)是否被这样的Set调用:

verify(myService).doSomething(any(Set.class));

但我想验证集合的预期内容。我试过这样的事情:

Set<String> expected = new HashSet<String>();
expected.add("item1");
expected.add("item2");
verify(myService).doSomething(expected);

此验证失败,因为由于“参数不同”,预期为[item1,item2],而实际是[item2,item1]。所以内容是相同的,但顺序不正确。

如何在不更改维护订单的正在使用的集合的情况下检查内容是否相同?

1 个答案:

答案 0 :(得分:2)

我想知道你是否过分简化了你的例子?两个Set个实例将是相同的,只要它们包含相同的对象,无论顺序如何。

请参阅下面的示例测试,该测试通过。

@Test
public void test() throws Exception {

  Foo foo = mock(Foo.class);

  Set<String> set = new HashSet<>();
  set.add("a");
  set.add("b");

  foo.doSomething(set);

  Set<String> set2 = new HashSet<>();
  set2.add("b");
  set2.add("a");

  verify(foo).doSomething(set2);
}

public interface Foo {
  void doSomething(Set<String> strings);
}