0

我有一个类似于这个的 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]。所以内容相同,但顺序不正确。

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

4

1 回答 1

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);
}
于 2013-06-07T14:17:19.853 回答