我用方法列表调用方法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
}
我得到的错误如下(这是完整的代码。我给出了最小的可能代码段):
Argument(s) are different! Wanted:
activity.doActivity(
.......
......
答案 0 :(得分:7)
以前曾在Can Mockito verify parameters based on their values at the time of method call?
询问过这个问题当您调用已经使用Mockito存根的方法时,Mockito将存储传递给它的参数,以便您稍后可以使用verify
。也就是说,它存储对象引用,而不是对象本身的内容。如果您稍后更改了这些对象的内容,那么您的verify
调用会将其参数与更新的对象进行比较 - 它不会生成原始对象的深层副本。
如果您需要验证对象的内容,则需要使用
使用Mockito Answer
进行其中任何一种操作的正确方法。因此,对于第二个选项,您将创建一个执行验证的Answer
,如果参数值不正确,则抛出AssertionFailedError
;而不是在测试结束时使用verify
。
答案 1 :(得分:1)
verify
比较调用verify
时的参数内容,而不是调用模拟方法时的参数内容。如果修改了列表的内容,则verify
将使用修改后的值。
另一种方法是使用Answer
代替调用方法后立即检查参数,或者您可以创建新列表而不是修改旧列表。
答案 2 :(得分:0)
现在可以使用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());
}