使用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
相关产品推荐
相关产品推荐

