我正在进行一些测试驱动的开发,并在我的测试用例中添加了一个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。)
答案 0 :(得分:6)
我刚用Mockito 1.9.5运行它,我无法重现你所描述的行为。但我相信我知道为什么它可能发生在旧版本上。
Mockito具有影响其模拟行为的“存根模式”和“验证模式”,并根据需要在这些模式之间切换。因此,当您编写verify
时,Mockito会切换到验证模式。对模拟方法的下一次调用会进行验证,而不是执行存根操作,但它也会将Mockito切换为验证模式。
所以当你写verify(api).doAThingWithAThingId(thing.getId())
时,Mockito 1.8.4进入验证模式;但是对thing.getId()
的调用将其置于verify
模式之外。然后,对doAThingWithAThingId
的调用实际上从未得到验证。
道德 - 在任何版本的Mockito中,不要在verify
之后的调用的参数中调用模拟上的任何方法。在开始验证之前,首先评估您需要的参数。