You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 07:51:01