Java9迁移后PowerMock测试报错:MockClassLoader无法访问JDK内部类
解决Java9迁移后PowerMock测试的IllegalAccessError问题
我来帮你搞定这个Java9迁移后PowerMock测试报错的问题,这是典型的模块系统(JPMS)权限适配问题,按下面的步骤操作就能解决:
1. 升级PowerMock到支持Java9的版本
你的PowerMock 1.7.4版本太老了,完全没适配Java9的模块规则,必须升级到2.0.0及以上的稳定版。比如换成2.0.9版本的依赖:
<dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency>
小提示:如果你的项目用的是Mockito 1.x,那还是用
powermock-api-mockito,但建议升级到Mockito 2.x,更适配Java9。
2. 修复maven-surefire-plugin的JVM参数配置
你当前的配置里写了多个argLine,Maven会只保留最后一个,之前的--add-modules参数相当于没生效!必须把所有JVM参数合并成一行,还要额外添加反射模块的开放权限:
<plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <!-- 顺便把插件也升级到支持Java9的版本,2.22.x以上都可以 --> <configuration> <includes> <include>**/*Test.java</include> <include>**/*Test.groovy</include> <include>**/*Spec.*</include> </includes> <forkMode>always</forkMode> <argLine> --add-modules java.xml.bind,java.activation --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --illegal-access=warn </argLine> </configuration> </plugin>
这里额外加了java.base/java.lang.reflect的开放参数,就是为了解决你报错里的jdk.internal.reflect类访问权限问题。
3. 确保Mockito版本和PowerMock匹配
PowerMock和Mockito版本是强绑定的,比如2.0.9版本的PowerMock最好搭配Mockito 2.23.4以上的版本,你可以明确添加Mockito的依赖:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.28.2</version> <scope>test</scope> </dependency>
为什么会出现这个错误?
简单说两个核心原因:
- 旧版PowerMock(1.7.4)完全没适配Java9的模块系统,不知道怎么请求访问JDK内部类的权限;
- 你配置的多个
argLine被Maven覆盖,导致需要的模块没被正确加载,同时缺少反射相关的权限开放。
内容的提问来源于stack exchange,提问作者Arar
相关产品推荐
相关产品推荐

