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

aar*_*tad 2 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())
Run Code Online (Sandbox Code Playgroud)

即使我没有将调用添加api.doAThingWithAThingId()到我的代码中,这个测试用例也会通过!但是,当我这样做的时候......

int id = thing.getId();
verify(api).doAThingWithAThingId(id);
Run Code Online (Sandbox Code Playgroud)

验证按预期失败.是什么导致了这种行为?

(为了记录,这是使用稍微旧版本的Mockito,1.8.4.)

Daw*_*ica 6

我刚用Mockito 1.9.5运行它,我无法重现你所描述的行为.但我相信我知道为什么它可能发生在旧版本上.

Mockito具有影响其模拟行为的"存根模式"和"验证模式",并根据需要在这些模式之间切换.所以当你写作时verify,Mockito会切换到验证模式.对模拟上的方法的下一次调用会进行验证,而不是执行存根操作,但它也会将Mockito切换到验证模式.

所以当你写作时verify(api).doAThingWithAThingId(thing.getId()),Mockito 1.8.4进入验证模式; 但调用thing.getId()将其置于verify模式之外.然后调用doAThingWithAThingId永远不会得到验证.

道德 - 在Mockito的任何版本中,不要在调用跟随调用的参数中调用模拟上的任何方法verify.在开始验证之前,首先评估您需要的参数.