java - Mockito 验证 : Verified during verify() than during mocked method call

标签 java junit mockito verify

我用对象列表调用方法 performAction 并验证相同的方法。调用此方法后,我修改了一些“对象”。

Mockito 验证失败,说参数不匹配(显示修改的对象),但我可以在 Debug模式下看到对象根据需要是正确的。

理想情况下,这种情况不应发生,因为应根据实际调用方法的时间应用验证。验证在测试方法中的验证调用期间是否比在模拟方法调用时适用?

测试类

@Test
public void test() throws Exception {
    List<ABC> objects = new ArrayList<ABC>();
    //populate objects.
    activity.performActions(objects);               
    verify(activity, times(1)).doActivity(objects);
}

测试方法:

public void performActions(List<ABC> objects) {

    activity.doActivity(urlObjects2PerformAction);
    //Modify objects                

}

我得到的错误如下(这是完整代码。我给出了尽可能小的代码片段):

Argument(s) are different! Wanted:
activity.doActivity(
.......
......

最佳答案

这已经被问过 - 在 Can Mockito verify parameters based on their values at the time of method call?

当您调用一个已被 Mockito stub 的方法时,Mockito 将存储传递给它的参数,以便您稍后可以使用 verify。也就是说,它存储对象引用,而不是对象本身的内容。如果您稍后更改这些对象的内容,那么您的 verify 调用会将其参数与更新后的对象进行比较 - 它不会对原始对象进行深度复制。

如果您需要验证对象的内容是什么,您将需要两者之一

  • 在方法调用时自己存储它们;或者
  • 在方法调用时验证它们。

正确的方法是使用 Mockito Answer。因此,对于第二个选项,您将创建一个执行验证的 Answer,并在参数值不正确时抛出一个 AssertionFailedError;而不是在测试结束时使用 verify

关于java - Mockito 验证 : Verified during verify() than during mocked method call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18423164/

相关文章:

java - 由于底层异常导致 MySQL 通信链接失败

java - 在单元测试中比较 ArrayList

java - 增加水法迷宫问题的值(value)

java - 将单元测试引入现有项目

java - 当我运行 mockito 测试时发生 WrongTypeOfReturnValue 异常

java - 当用户不存在时在单元测试用例中模拟 BindingResult

java - 队列,优先级如何实现

java - SLF4J:加载类 "org.slf4j.impl.StaticLoggerBinder"失败。运行 JUnit 测试时

spring-mvc - Mockito 与 Spring mvc

java - Camel 测试 - 如何从 FileConsumer/FTPConsumer 测试处理器?