创建模拟对象时 Mockito 无法访问对象异常

Roh*_*nna 14 java mockito

java.lang.reflect.InaccessibleObjectException尝试 Mock 一个对象一段时间

Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @238e0d81
Run Code Online (Sandbox Code Playgroud)

Han*_*ans 19

如果 Mockito 需要对 Java 模块中的非公共部分进行反射访问,则可能会发生这种情况。如果您想坚持使用较新的 Java 版本,您可以通过在--add-opens调用中显式允许访问来解决此java问题 - 错误消息很有帮助,因为它为您提供了所需的模块和包:

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

(目标ALL-UNNAMED适用于所有非模块化类。请参阅https://www.oracle.com/corporate/features/understanding-java-9-modules.html了解这些指令的简要介绍。)

请注意,此选项在编译期间不适用,即不适用于javac; 它是一个运行时选项。

如果您使用 Gradle,您可以将其添加到您的测试任务build.gradle

    test {
         jvmArgs '--add-opens=java.base/java.lang=ALL-UNNAMED'
     }
Run Code Online (Sandbox Code Playgroud)

或者,具有相同效果的替代语法:

    test {
         jvmArgs '--add-opens', 'java.base/java.lang=ALL-UNNAMED'
     }
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

8919 次

最近记录:

2 年,3 月 前