最近我正在将项目从 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
您知道这个问题有什么解决方法吗?如果有,请提供解决方案。
作为权宜之计(直到 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>
这应该允许解决方案与从 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
转到
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
这工作得很好......但是添加这个surefire插件后,target/surefire-reports处的surefire-reports不会生成,导致声纳中的代码覆盖率为零。有什么想法或解决方法吗?