创建模拟对象时出现Mockito不可访问对象异常



在尝试模拟对象时获得java.lang.reflect.InaccessibleObjectException

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

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

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'
}

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

test {
jvmArgs '--add-opens', 'java.base/java.lang=ALL-UNNAMED'
}

最新更新