You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:04:34