我正在做一些测试驱动的开发,并向我的测试用例添加了 Mockito verify() 调用,如下所示(名称已更改以保护无辜的代码):
Api api = mock(Api.class);
Thing thing = mock(Thing.class);
when(thing.getId()).thenReturn(1);
// later...
verify(api).doAThingWithAThingId(thing.getId())
即使我没有将调用api.doAThingWithAThingId()
添加到我的代码中,这个测试用例还是通过了!但是,当我这样做时...
int id = thing.getId();
verify(api).doAThingWithAThingId(id);
验证按预期失败。是什么导致了这种行为?
(郑重声明,这是使用稍旧版本的 Mockito,1.8.4。)
最佳答案
我刚刚使用 Mockito 1.9.5 运行此程序,但无法重现您所描述的行为。但我相信我知道为什么旧版本会发生这种情况。
Mockito 有一个“ stub 模式”和一个“验证模式”,会影响其模拟的行为,并根据需要在这些模式之间切换。因此,当您编写 verify
时,Mockito 会切换到验证模式。下一次调用模拟上的方法会进行验证,而不是执行 stub 操作,但它也会将 Mockito 切换出验证模式。
因此,当您编写 verify(api).doAThingWithAThingId(thing.getId())
时,Mockito 1.8.4 会进入验证模式;但对 thing.getId()
的调用使其脱离 verify
模式。那么对 doAThingWithAThingId
的调用永远不会真正得到验证。
道德 - 在任何版本的 Mockito 中,都不要在 verify
之后调用的参数中调用模拟上的任何方法。在开始验证之前,首先评估您需要的参数。
关于java - Mockito:使用模拟参数调用 verify() 不会触发失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19386664/