Mockito无法mock方法调用返回值,报MissingMethodInvocationException错误
问题根因
你当前触发的MissingMethodInvocationException核心是以下几个错误共同导致的:
- 未为
WebSplitUtils开启静态mock上下文:你需要stub的WebSplitUtils.getConfigService()是静态方法,必须在Mockito的静态mock作用域内才能stub,你当前仅开启了JwtUtil的静态mock,Mockito无法识别WebSplitUtils的方法调用属于mock操作 - 错误mock了待测试类:你把需要验证逻辑的
JwtUtil整个静态mock了,导致执行JwtUtil.checkIssuer时会走mock逻辑,不会执行真实的业务代码,测试完全失效 - 不规范的常量调用:你通过mock的
configService实例调用静态常量ENABLE_CHECK_ISSUER_PBX,可能触发Mockito的参数匹配异常,静态常量应通过类名直接调用 - 缺少必要的stub逻辑:你没有为
decodedJWT.getIssuer()设置返回值,即使前面的mock逻辑正确,也无法触发TokenException
修复步骤
- 移除
JwtUtil的静态mock声明,保留真实方法调用 - 新增
WebSplitUtils的静态mock到try-with-resources块,为静态方法stub提供作用域 - 替换
configService.ENABLE_CHECK_ISSUER_PBX为ConfigServiceImpl.ENABLE_CHECK_ISSUER_PBX,规范常量调用 - 补充
decodedJWT.getIssuer()的stub逻辑,返回和测试入参Issuer.PBXWEB.value()不同的值,触发异常校验
修正后的测试代码
@Test public void negative_test_for_issuer_for_JWT_used_in_method_getCallInNumbersForPBX() { DecodedJWT decodedJWT = Mockito.mock(DecodedJWT.class); ConfigService configService = Mockito.mock(ConfigServiceImpl.class); // 仅开启WebSplitUtils的静态mock,JwtUtil保留真实调用 try (MockedStatic<WebSplitUtils> webSplitUtilsMock = Mockito.mockStatic(WebSplitUtils.class)) { // 修正常量调用方式 Mockito.when(configService.isEnableConfig(ConfigServiceImpl.ENABLE_CHECK_ISSUER_PBX)).thenReturn(true); Mockito.when(WebSplitUtils.getConfigService()).thenReturn(configService); // 补充decodedJWT的stub,返回不匹配的issuer Mockito.when(decodedJWT.getIssuer()).thenReturn("invalid_issuer"); // 断言真实JwtUtil.checkIssuer方法抛出异常 Assertions.assertThrows(TokenException.class,()-> JwtUtil.checkIssuer(decodedJWT, Issuer.PBXWEB.value())); } }
额外排查点
如果修改后仍有问题,可按以下顺序排查:
- 确认Mockito版本 >= 3.4.0,只有该版本及以上才支持静态方法mock
- 确认
ConfigService接口/类的isEnableConfig方法不是final修饰,final方法无法被mock - 确认测试类的classpath下
mockito-extensions/org.mockito.plugins.MockMaker文件内容确实为mock-maker-inline,且没有被其他配置覆盖
内容的提问来源于stack exchange,提问作者Vishal Kohli
相关产品推荐
相关产品推荐

