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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:54:57