OpenJDK11+Mockito3.12.4测试遇NoClassDefFoundError问题求助
问题描述
使用以下环境执行JUnit测试时触发错误:
- OpenJDK 11
- Mockito 3.12.4
- PowerMock 2.0.9
- 第三方库pcm.jar(基于Java 1.8编译)
错误信息:
shouldReturnSecondaryDataServiceMapFromFList(com.xxxxx.SecondaryDataServiceMapTest) Time elapsed: 0.301 sec <<< FAILURE! org.mockito.exceptions.base.MockitoException: Mockito cannot mock this class: class com.portal.pcm.FList. If you're not sure why you're getting this error, please report to the mailing list. Java : 11 JVM vendor name : Red Hat, Inc. JVM vendor version : 11.0.15+9-LTS JVM name : OpenJDK 64-Bit Server VM JVM version : 11.0.15+9-LTS JVM info : mixed mode OS name : Windows 10 OS version : 10.0 You are seeing this disclaimer because Mockito is configured to create inlined mocks. You can learn about inline mocks and their limitations under item #39 of the Mockito class javadoc. Underlying exception : org.mockito.exceptions.base.MockitoException: Could not modify all classes [class java.util.Hashtable, class com.portal.pcm.FList, interface java.io.Externalizable, class java.util.Dictionary]
at java.base/java.lang.Class.getDeclaredMethods0(Native Method) at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166) at java.base/java.lang.Class.getDeclaredMethods(Class.java:2309) at net.bytebuddy.description.method.MethodList$ForLoadedMethods.<init>(MethodList.java:148) at net.bytebuddy.description.type.TypeDescription$ForLoadedType.getDeclaredMethods(TypeDescription.java:8655) at net.bytebuddy.dynamic.scaffold.InstrumentedType$Factory$Default$1.represent(InstrumentedType.java:421) at net.bytebuddy.ByteBuddy.redefine(ByteBuddy.java:782) at net.bytebuddy.ByteBuddy.redefine(ByteBuddy.java:757) at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.transform(InlineBytecodeGenerator.java:381) at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246) at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188) at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:563) at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method) at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:167) at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.triggerRetransformation(InlineBytecodeGenerator.java:276) ... 50 more Caused by: java.lang.ClassNotFoundException: sun.misc.ObjectInputFilter$FilterInfo at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 65 more
核心疑问:哪个jar引用了sun.misc.ObjectInputFilter$FilterInfo类?需要添加或排除什么依赖解决问题?
解决方案
1. 定位引用来源
sun.misc.ObjectInputFilter$FilterInfo是Java 9之前的类,Java 11中该类已被迁移到java.io.ObjectInputFilter,原sun.misc下的版本被移除。出现这个错误的根源是Mockito依赖的ByteBuddy旧版本在处理类字节码转换时,尝试加载了这个已废弃移除的类。第三方库pcm.jar本身是Java 1.8编译的,不会直接触发该问题。
2. 具体解决步骤
- 升级Mockito版本:Mockito 3.12.x对Java 11的兼容性不足,建议升级到Mockito 4.x及以上版本(例如4.11.0),新版本依赖的ByteBuddy已适配Java 11的类结构,不会再引用废弃的sun.misc类。
- 匹配PowerMock版本:PowerMock 2.0.9仅支持Mockito 3.x,若升级到Mockito 4.x,需要同步升级PowerMock到2.1.0或更高版本,保证两者兼容性。
- 临时修复:替换ByteBuddy版本(不推荐长期使用):如果暂时无法升级Mockito,可以手动排除Mockito依赖的旧版ByteBuddy,引入兼容Java 11的ByteBuddy版本(例如1.12.10)。Maven配置示例:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.12.4</version> <exclusions> <exclusion> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy</artifactId> </exclusion> <exclusion> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy-agent</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy</artifactId> <version>1.12.10</version> <scope>test</scope> </dependency> <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy-agent</artifactId> <version>1.12.10</version> <scope>test</scope> </dependency>
内容的提问来源于stack exchange,提问作者Chowdappa
相关产品推荐
相关产品推荐

