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

标签 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。)

最佳答案

我刚刚使用 Mockito 1.9.5 运行此程序,但无法重现您所描述的行为。但我相信我知道为什么旧版本会发生这种情况。

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

因此,当您编写 verify(api).doAThingWithAThingId(thing.getId()) 时,Mockito 1.8.4 会进入验证模式;但对 thing.getId() 的调用使其脱离 verify 模式。那么对 doAThingWithAThingId 的调用永远不会真正得到验证。

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

关于java - Mockito:使用模拟参数调用 verify() 不会触发失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19386664/

相关文章:

java - 如何正确测试java中类的内部方法

java - 如何相对于子目录运行 Jenkins 管道?

java - Java中如何检查JsonNode是单个元素还是数组?

java - 坚持递归算法

c# - 最小起订量:设置一个方法来填充作为参数传递的对象内的集合

java - 如何在selenium中使用By.tagName查找子标记名?

javascript - $scopeProvider <- $scope/未知提供者

java - 未调用模拟方法

java - 给玩家体验

unit-testing - 对 SLF4J 日志消息进行单元测试的最佳方法是什么?