我正在做一些测试驱动的开发,并在我的测试用例中添加了一个 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具有"存根模式"和"验证模式",会影响其模拟的行为,并根据需要在这些模式之间切换。 所以当你写verify
时,Mockito切换到验证模式。 下一次调用模拟上的方法会执行验证,而不是执行存根操作,但它也会将 Mockito 切换出验证模式。
所以当你写verify(api).doAThingWithAThingId(thing.getId())
时,Mockito 1.8.4进入验证模式;但是对thing.getId()
的调用会让它退出verify
模式。 然后,对doAThingWithAThingId
的调用从未真正得到验证。
道德 - 在任何版本的 Mockito 中,不要在模拟上调用任何方法,在参数中调用 verify
. 在开始验证之前,请先评估所需的参数。