使用Mockito无法Mock返回布尔值的静态方法,总是调用真实方法
你提供的Mock代码如下:
try(MockedStatic<ValidatorUtil> theMock = Mockito.mockStatic(ValidatorUtil.class)) { Assertions.assertNotNull(theMock); theMock.when(() -> ValidatorUtil.isValid(configurator)).thenReturn(true); Assertions.assertTrue(ValidatorUtil.isValid(configurator)); }
问题排查及解决方案
1. 检查Mockito依赖配置
Mock静态方法必须使用mockito-inline依赖,默认的mockito-core不支持静态方法Mock,如果你当前引入的是core包,请替换为inline依赖,Maven配置示例如下:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <version>4.0+ 稳定版本即可</version> <scope>test</scope> </dependency>
注意不要同时引入mockito-core和mockito-inline,会产生依赖冲突。
2. 确认Mock作用域覆盖调用位置
MockedStatic的生效范围严格限制在try-with-resources代码块内部、且仅对当前线程生效,如果你实际业务代码调用ValidatorUtil.isValid的逻辑在try块外部,会直接走真实方法。请调整代码结构,保证所有需要Mock生效的调用都在try块内部。
3. 修正Stub写法(参数匹配器场景)
如果使用参数匹配器,确保所有参数都使用匹配器、不要混合具体值和匹配器,正确写法如下:
try(MockedStatic<ValidatorUtil> theMock = Mockito.mockStatic(ValidatorUtil.class)) { // 单参数方法用any匹配所有入参 theMock.when(() -> ValidatorUtil.isValid(Mockito.any(Configurator.class))).thenReturn(true); // 业务调用逻辑放在此处 Assertions.assertTrue(ValidatorUtil.isValid(configurator)); }
同时检查调用mockStatic时是否额外指定了Mockito.CALLS_REAL_METHODS参数,如果指定了该参数,所有未手动Stub的方法都会走真实逻辑,删掉该参数即可。
4. 高版本JDK适配
如果你使用JDK9及以上版本,需要在测试的JVM启动参数中添加以下配置,解决模块化权限限制:
--add-opens java.base/java.lang=ALL-UNNAMED
5. 排除第三方框架冲突
检查测试类是否使用了PowerMock相关的Runner或注解,PowerMock和Mockito的静态Mock逻辑存在冲突,二者不能同时使用。
同时确认isValid方法没有被final、native修饰,这类方法Mockito无法正常Mock。
内容的提问来源于stack exchange,提问作者Vishal Chaudhary
相关产品推荐
相关产品推荐

