Mockito:使用模拟参数调用verify()不会触发失败

时间:2013-10-15 16:49:11

标签: java unit-testing mockito

我正在进行一些测试驱动的开发,并在我的测试用例中添加了一个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。)

1 个答案:

答案 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之后的调用的参数中调用模拟上的任何方法。在开始验证之前,首先评估您需要的参数。