Powermock 与 JDK 17 的兼容性

问题描述 投票:0回答:4

最近我正在将项目从 JDK 11 升级到 JDK 17。升级后,powermock 似乎出现问题。运行 AUT 时,我收到以下错误:

java.lang.RuntimeException: PowerMock internal error: Should never throw exception at this level
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @3fc34119

您知道这个问题有什么解决方法吗?如果有,请提供解决方案。

java mocking powermock powermockito java-17
4个回答
26
投票

作为权宜之计(直到 Powermock 更新),您应该能够通过将以下参数传递给 JVM 来运行测试:

--add-opens java.base/java.lang=ALL-UNNAMED

如果您使用

Maven
运行测试,您可以像这样配置
surefire-plugin

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>${plugin.surefire.version}</version>
  <configuration>
    <argLine>--add-opens java.base/java.lang=ALL-UNNAMED</argLine>
  </configuration>
</plugin>

14
投票

这应该允许解决方案与从 IDE(在我的例子中为 Android Studio)内部运行的测试一起使用。

我必须这样做,因为 PowerMock 不能很好地与 Android 上的 Java 17 兼容。

在您的顶级项目 build.gradle 中,在底部添加

subprojects{
    tasks.withType(Test).configureEach{
        jvmArgs = jvmArgs + ['--add-opens=java.base/java.lang=ALL-UNNAMED']
    }
}

如果您的 Gradle 文件使用 Kotlin,请参阅 https://github.com/square/okhttp/blob/f9901627431be098ad73abd725fbb3738747461c/build.gradle.kts#L153


0
投票

转到

Eclipse IDE
中的运行配置并选择
Arguments
选项卡,然后在
VM arguments
中添加以下内容并运行应用程序。

--add-opens java.base/java.lang=ALL-UNNAMED

如果

util
text
包有任何问题,我们也可以添加其他 VM 参数,如下所示,

--add-opens java.base/java.util=ALL-UNNAMED
--add-opens java.base/java.text=ALL-UNNAMED

0
投票

这工作得很好......但是添加这个surefire插件后,target/surefire-reports处的surefire-reports不会生成,导致声纳中的代码覆盖率为零。有什么想法或解决方法吗?

© www.soinside.com 2019 - 2024. All rights reserved.