Powermock 与 JDK 17 的兼容性

san*_*lan 23 java mocking powermock powermockito java-17

最近我正在将项目从 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
Run Code Online (Sandbox Code Playgroud)

您是否知道此问题的任何解决方法,如果可以,请提供解决方案。

小智 25

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

--add-opens java.base/java.lang=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)

如果您使用 运行测试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>
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用这些: --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util =ALL-UNNAMED --add-opens java.base/java.base=ALL-UNNAMED (3认同)
  • 如果我想在 Intellij 中运行测试,如何使其工作?换句话说,如果我右键单击测试类,然后单击运行,它仍然会抛出上面提到的异常。 (3认同)

mbw*_*asi 12

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

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

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

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

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