【问题标题】:Mockito Verify: Verified during verify() than during mocked method callMockito 验证:在 verify() 期间验证比在模拟方法调用期间验证
【发布时间】:2013-08-24 21:12:01
【问题描述】:

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

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

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

测试类

@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                

}

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

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

【问题讨论】:

  • 将代码缩减为重现问题的最短示例,粘贴此示例的完整代码,以及您得到的准确完整的错误消息。
  • @JBNizet 修改了问题。

标签: java junit mockito verify


【解决方案1】:

之前有人问过这个问题 - Can Mockito verify parameters based on their values at the time of method call?

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

如果您需要验证对象的内容是什么,则需要任一

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

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

【讨论】:

    【解决方案2】:

    verify 在调用 verify 时比较参数内容,而不是在调用模拟方法时比较参数内容。如果列表的内容被修改,那么verify 将使用修改后的值。

    另一种方法是使用Answer 在调用方法后立即检查参数,或者您可以创建一个新列表而不是修改旧列表。

    【讨论】:

      【解决方案3】:

      现在可以使用 ArgumentCaptor 解决这个问题

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

      【讨论】:

      • 你用什么Java?似乎答案不适用于Java 8,至少对于复杂对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      相关资源
      最近更新 更多