2

我正在做一些测试驱动的开发,并像这样向我的测试用例添加了一个 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。)

4

1 回答 1

6

我刚刚用 Mockito 1.9.5 运行了这个,我无法重现你描述的行为。但我相信我知道为什么旧版本可能会发生这种情况。

Mockito 具有影响其模拟行为的“存根模式”和“验证模式”,并根据需要在这些模式之间切换。因此,当您编写时verify,Mockito 会切换到验证模式。对 mock 上的方法的下一次调用会执行验证,而不是执行存根操作,但它也会将 Mockito 切换出验证模式。

因此,当您编写时verify(api).doAThingWithAThingId(thing.getId()),Mockito 1.8.4 进入验证模式;但调用thing.getId()将其退出verify模式。然后对doAThingWithAThingIdnever 的调用实际上得到验证。

道德 - 在任何版本的 Mockito 中,不要在 mock 上调用任何方法,在调用后面的参数中verify。在开始验证之前,首先评估您需要的参数。

于 2013-10-15T18:12:52.693 回答