JUnit+Mockito测试出现ExceptionInInitializerError问题求助
解决Mockito mock ResultSet时出现的InaccessibleObjectException错误
执行ResultSet resultSet = Mockito.mock(ResultSet.class)时触发以下异常:
java.lang.ExceptionInInitializerError at org.mockito.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:167) at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217) at org.mockito.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105) at org.mockito.cglib.proxy.Enhancer.<clinit>(Enhancer.java:70) at org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95) at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57) at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49) at org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24) at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33) at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59) at org.mockito.Mockito.mock(Mockito.java:1284) at org.mockito.Mockito.mock(Mockito.java:1162) Caused by: 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 @6cc7b4de at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) at java.base/java.lang.reflect.Method.setAccessible(Method.java:193) at org.mockito.cglib.core.ReflectUtils$2.run(ReflectUtils.java:57) at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) at org.mockito.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:47)
问题原因
该错误源于Mockito版本与Java 9+模块系统不兼容:旧版本Mockito依赖CGLib生成代理类,而CGLib会通过反射尝试访问Java核心模块java.base的受保护方法,但Java模块系统默认禁止未命名模块访问这些内部API,从而抛出权限异常。
解决方案
1. 升级Mockito到兼容Java 9+的版本(推荐)
Mockito 3.0.0及以上版本已适配Java模块系统,改用ByteBuddy替代CGLib生成mock类,彻底解决权限问题。
- Maven依赖更新示例:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.11.0</version> <!-- 替换为最新稳定版 --> <scope>test</scope> </dependency>
- Gradle依赖更新示例:
testImplementation 'org.mockito:mockito-core:4.11.0'
2. 临时添加JVM启动参数(不推荐,仅应急)
若暂时无法升级版本,可通过JVM参数绕过模块权限检查:
--add-opens java.base/java.lang=ALL-UNNAMED
注意:此方案仅为临时 workaround,后续Java版本可能进一步限制此类反射访问,长期仍需升级Mockito。
3. 强制使用ByteBuddy作为Mock生成器(过渡版本适用)
如果你的Mockito版本处于2.x到3.x之间,可在测试资源目录下创建文件mockito-extensions/org.mockito.plugins.MockMaker,内容写入:
mock-maker-inline
这会强制Mockito使用ByteBuddy生成mock,避免CGLib引发的权限问题。
内容的提问来源于stack exchange,提问作者User1515
相关产品推荐
相关产品推荐

