使用Mockito verify的times方法遇异常:正确次数报null,错误次数提示次数过多
Mockito verify校验方法调用次数时的异常问题
我在使用Mockito的verify方法测试testMethod的调用次数(该方法实际仅执行2次)时遇到异常:
- 指定
times(2)校验时,报错信息中出现null - 改为
times(1)时,报错明确提示实际调用次数为2次,不符合预期的1次
具体报错信息
指定times(2)时的报错:
verify(XXXXXXX, times(2)).testMethod(any(XXXXXX.class)) | | | | | | | | | null null class XXXXXX | | Wanted invocations count: 2 | Mock for XXXXXXX, hashCode: 292294397 Mock for XXXXXXX, hashCode: 292294397
指定times(1)时的报错:
verify(XXXXXXX, times(1)).testMethod(any(XXXXXX.class)) | | | | | | | | | | null class XXX | | | org.mockito.exceptions.verification.TooManyActualInvocations: | | | XXX.XXXX( | | | <any XXX> | | | ); | | | Wanted 1 time: | | | -> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | | | But was 2 times: | | | -> at XXXX.XXX(XXX.java:129) | | | -> at XXXXX.XXX(XXX.java:129) | | | | | | | | Wanted invocations count: 1
排查方向
- 检查Mock实例一致性:报错中出现两个相同hashCode的Mock实例,大概率是测试过程中Mock对象被重复初始化,导致
verify校验的实例和实际接收调用的实例不是同一个。 - 校验参数匹配器:报错里的
null可能和any(XXXXXX.class)的使用有关,尝试替换为具体参数匹配器(如eq()),确认参数类型是否完全匹配。 - 确认实际调用记录:通过
Mockito.mockingDetails(mockInstance).getInvocations()打印所有调用日志,核对实际调用次数、参数是否和预期一致。 - 升级Mockito版本:部分旧版本Mockito在多调用校验场景下存在bug,尝试升级到4.x或5.x的稳定版本。
内容的提问来源于stack exchange,提问作者climy007
相关产品推荐
相关产品推荐

