Java 17中Mockito.mock()无法正常Mock类的问题求助
解决Java 17升级后Mockito.mock()失效的问题
以下是几个常见原因及对应的解决办法:
模块化访问限制
Java 9及以上引入的模块系统(JPMS)会默认限制反射访问类内部成员,而Mockito依赖反射实现Mock。如果目标类在模块化项目中:- 在
module-info.java中为Mockito开放目标包:opens com.yourproject.targetpackage to org.mockito; - 若项目未使用模块化(基于classpath运行),可在测试VM参数中添加
--add-opens开放必要包,例如:
使用Maven Surefire插件时,可在插件配置中加入该参数:--add-opens java.base/java.lang=ALL-UNNAMED<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>--add-opens java.base/java.lang=ALL-UNNAMED</argLine> </configuration> </plugin>
- 在
Mockito版本不兼容
旧版Mockito对Java 17支持不完善,需升级至兼容版本(推荐Mockito 4.0.0+,优先选择最新5.x系列)。Maven依赖配置示例:<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency>无法Mock最终类/方法
Mockito默认不支持Mock最终类或方法,若目标类是最终类,需启用inline mock maker:
在测试资源目录下创建src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker文件,文件内容仅一行:mock-maker-inline配置后Mockito可通过inline方式Mock最终类、方法及静态方法。
反射权限受限
Java 17收紧了反射访问权限,若测试涉及JDK内部类或敏感API,需在VM参数中添加额外权限配置,例如:--add-accessibility java.base/java.lang.reflect=ALL-UNNAMED
内容的提问来源于stack exchange,提问作者DilliBabu S
相关产品推荐
相关产品推荐

