You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:01:54