如何配置Mockito忽略准备阶段调用,仅验证执行阶段的EventListener.call()?
解决Mockito忽略准备阶段调用,仅验证执行阶段方法调用的问题
这其实是Mockito日常使用中很常见的场景,你有几种简洁的方式来实现需求,下面给你逐一说明:
方法1:重置Mock(最直接的方式)
在准备阶段(arrange)完成后、执行阶段(act)开始前,调用Mockito.reset()清空mock的所有交互记录,这样后续的验证就只会关注重置之后的调用(也就是removeElement触发的那一次)。
修改后的测试代码如下:
@Test public void remove_should_call_event_listener() { // arrange EventListener eventListener = Mockito.mock(EventListener.class); MyService myService = new MyService(eventListener); myService.addElement("dummy"); // 重置mock,清除准备阶段的调用记录 Mockito.reset(eventListener); // act myService.removeElement("dummy"); // assert Mockito.verify(eventListener).call(); }
这种方式逻辑清晰,完全隔离了准备阶段的干扰,让验证只聚焦在你真正关心的执行阶段操作上。
方法2:使用调用顺序验证(InOrder)
如果你不仅想验证removeElement触发了调用,还想确认调用顺序符合预期(先add时调用,再remove时调用),可以用InOrder按顺序验证两次调用:
@Test public void remove_should_call_event_listener() { // arrange EventListener eventListener = Mockito.mock(EventListener.class); MyService myService = new MyService(eventListener); myService.addElement("dummy"); // act myService.removeElement("dummy"); // assert InOrder inOrder = Mockito.inOrder(eventListener); // 验证准备阶段的调用(可选,若不需要可以省略) inOrder.verify(eventListener).call(); // 验证执行阶段的调用,这就是你要确认的remove操作触发的调用 inOrder.verify(eventListener).call(); }
方法3:验证调用次数
因为准备阶段调用了1次,执行阶段又调用了1次,总共会有2次call()调用。如果你明确知道总次数,可以直接验证调用次数为2,间接确认执行阶段的调用确实发生了:
@Test public void remove_should_call_event_listener() { // arrange EventListener eventListener = Mockito.mock(EventListener.class); MyService myService = new MyService(eventListener); myService.addElement("dummy"); // act myService.removeElement("dummy"); // assert Mockito.verify(eventListener, Mockito.times(2)).call(); }
这三种方法里,重置Mock是最贴合你需求的,因为它完全忽略了准备阶段的调用,让验证只针对执行阶段的操作。
内容的提问来源于stack exchange,提问作者Roland Weisleder
相关产品推荐
相关产品推荐

