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

使用Mockito模拟IntConsumer失败,verify时抛出MockitoException求助

解决Mockito验证IntConsumer时抛出的MockitoException问题

嘿,我发现你这段测试代码里的问题了,为啥会抛出那个MockitoException?其实是你验证IntConsumer mock对象的写法不对!先看看你的原代码:

class TickerServiceImplTest { 
    @Test 
    void testRunIterations() { 
        TickerServiceImpl tickerService = new TickerServiceImpl(); 
        int ticksToRun = 100; 
        tickerService.setTicksToRun(ticksToRun); 
        IntConsumer intConsumerMock = mock(IntConsumer.class); 
        tickerService.run(intConsumerMock); 
        verify(intConsumerMock, times(ticksToRun)); 
    }
}

问题根源

你调用verify(intConsumerMock, times(ticksToRun))的时候,只给了mock对象和预期的调用次数,但没告诉Mockito要验证哪个方法啊!IntConsumer的核心方法是accept(int value),你必须明确指定要验证这个方法的调用情况,不然Mockito根本不知道该检查什么,就会抛出那个让人摸不着头脑的异常。

修复方案

把verify的代码改成下面这样,明确指定要验证accept方法的调用次数:

class TickerServiceImplTest { 
    @Test 
    void testRunIterations() { 
        TickerServiceImpl tickerService = new TickerServiceImpl(); 
        int ticksToRun = 100; 
        tickerService.setTicksToRun(ticksToRun); 
        IntConsumer intConsumerMock = mock(IntConsumer.class); 
        tickerService.run(intConsumerMock); 
        // 明确验证accept方法被调用ticksToRun次,anyInt()表示不关心传入的具体数值
        verify(intConsumerMock, times(ticksToRun)).accept(anyInt()); 
    }
}

如果你的业务逻辑里,accept方法传入的是特定数值,也可以把anyInt()换成具体的参数匹配器,比如eq(某个具体值),这样就能更精准地验证参数是否符合预期。

这样修改之后,Mockito就能正确识别你要验证的行为,不会再抛出那个异常啦。

内容的提问来源于stack exchange,提问作者ehudm1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:47:58