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

PowerMock与Mockito在JDK 17下无法运行,求解决方案

解决方案:JDK17下PowerMock/Mockito JUnit4测试初始化失败问题

问题根源

你使用的PowerMock 1.7.4、Mockito 1.10.19都是严重过时的版本,完全不兼容JDK17:

  • JDK9+引入的模块化系统(JPMS)限制了私有API的访问,而老版本PowerMock/Mockito依赖Sun/Oracle的私有反射API,这些API在JDK17中被彻底移除。
  • 配套的Objenesis版本过旧,无法处理JDK17的实例化逻辑。

可行解决方案

1. 升级到兼容JDK17的依赖版本

这是最根本的解决办法,以下是经过验证的版本组合(支持JUnit4 + JDK17):

Maven依赖示例:

<!-- JUnit 4核心依赖 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

<!-- PowerMock JUnit4模块 -->
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>

<!-- PowerMock与Mockito的桥接依赖 -->
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>

<!-- Mockito核心库(兼容JDK17) -->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.3.1</version>
    <scope>test</scope>
</dependency>

Gradle依赖示例:

testImplementation 'junit:junit:4.13.2'
testImplementation 'org.powermock:powermock-module-junit4:2.0.9'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.9'
testImplementation 'org.mockito:mockito-core:4.3.1'

2. 添加JVM参数突破JDK17的反射限制

即使升级依赖,JDK17的强封装机制仍可能阻止PowerMock的反射操作,需添加以下VM参数:

--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
  • IDE运行时:在IntelliJ/Eclipse的Run配置中,找到「VM Options」栏粘贴上述参数。
  • Maven构建时:在maven-surefire-plugin中配置参数:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M7</version>
        <configuration>
            <argLine>
                --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
            </argLine>
        </configuration>
    </plugin>
    

3. 极端情况:降级JDK到8(不推荐)

如果因项目限制无法升级依赖,唯一的妥协方案是将JDK版本降级到8——老版本PowerMock/Mockito仅支持JDK8及以下环境。


内容的提问来源于stack exchange,提问作者Vishalmishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:57:28