在尝试模拟对象时获得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'
}