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.)
我刚用Mockito 1.9.5运行它,我无法重现你所描述的行为.但我相信我知道为什么它可能发生在旧版本上.
Mockito具有影响其模拟行为的"存根模式"和"验证模式",并根据需要在这些模式之间切换.所以当你写作时verify
,Mockito会切换到验证模式.对模拟上的方法的下一次调用会进行验证,而不是执行存根操作,但它也会将Mockito切换到验证模式.
所以当你写作时verify(api).doAThingWithAThingId(thing.getId())
,Mockito 1.8.4进入验证模式; 但调用thing.getId()
将其置于verify
模式之外.然后调用doAThingWithAThingId
永远不会得到验证.
道德 - 在Mockito的任何版本中,不要在调用跟随调用的参数中调用模拟上的任何方法verify
.在开始验证之前,首先评估您需要的参数.
归档时间: |
|
查看次数: |
300 次 |
最近记录: |