java - 在对 void 方法进行单元测试时,如何确定集合中的元素?

标签 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。我已经 mock 了 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]。所以内容是相同的,但顺序不正确。

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

最佳答案

我想知道你的例子是否过于简化了?只要两个 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);
}

关于java - 在对 void 方法进行单元测试时,如何确定集合中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16985986/

相关文章:

java - 作用域 bean 应如何在 Hazelcast 中触发 session 创建

java - 多参数搜索,java集合选择建议

Java hibernate : Persist automatically after setting a field

java - Mockito 在测试 hibernate 方法时总是返回 NULL

java - 如何模拟 Jersey REST 客户端以抛出 HTTP 500 响应?

java - 在将对象从 Java 传递到 Jython 时保留对象的 Java 类型

java - 如何在 junit 中为 Jooq Select Query 编写单元测试

java - 如何用一个打印 "root cause first"堆栈跟踪替换 JUnit 4.12 中的全局异常处理程序?

java - 如何在每次调用 doReturn 时返回一个新实例?

java - @RunWith 导致 Maven 忽略我用自己的运行者运行的测试