从JDK8升级至JDK17后JUnit测试因Mockito初始化失败报错
报错信息
java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:84)
at jdk.proxy2/jdk.proxy2.$Proxy26.isTypeMockable(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at org.mockito.internal.configuration.plugins.PluginInitializer.loadImpl(PluginInitializer.java:52)
... 59 more
Caused by: org.mockito.exceptions.base.MockitoInitializationException:
Could not initialize inline Byte Buddy mock maker.It appears as if your JDK does not supply a working agent attachment mechanism.
Java : 17
JVM vendor name : Oracle Corporation
JVM vendor version : 17.0.11+7-LTS-207
JVM name : Java HotSpot(TM) 64-Bit Server VM
JVM version : 17.0.11+7-LTS-207
JVM info : mixed mode, sharing
OS name : Windows 10
OS version : 10.0
at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.(InlineByteBuddyMockMaker.java:234)
... 65 more
Caused by: java.lang.NoClassDefFoundError: net/bytebuddy/agent/ByteBuddyAgent
at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.(InlineByteBuddyMockMaker.java:117)
... 65 more
Caused by: java.lang.ClassNotFoundException: net.bytebuddy.agent.ByteBuddyAgent
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 66 more
核心原因
报错根源是缺少net.bytebuddy.agent.ByteBuddyAgent类,Mockito的内联Mock生成器依赖该类在JDK17环境中完成代理类创建。JDK17的模块系统与JDK8差异较大,旧版本Mockito未适配JDK17,导致依赖缺失。
解决步骤
- 升级Mockito版本:使用支持JDK17的Mockito版本(推荐4.0+,例如4.11.0及以上),新版本已适配JDK17模块系统,会自动引入兼容的ByteBuddy依赖。
- 手动补充ByteBuddy Agent依赖:若升级Mockito后问题仍存在,直接添加依赖:
Maven:
Gradle:<dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy-agent</artifactId> <version>1.14.11</version> <scope>test</scope> </dependency>testImplementation 'net.bytebuddy:byte-buddy-agent:1.14.11' - 临时切换Mock生成器(不推荐长期使用):在
src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker文件中添加:
该方案会禁用内联生成器,使用传统Mock方式,仅作为临时应急手段,因为内联生成器支持更多Mock场景。mock-maker-inline=false
内容的提问来源于stack exchange,提问作者Shivangi Tripathi

