You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Mockito 2与SpringBoot 1.5.11.RELEASE:org.mockito.Mockito类初始化失败

解决Mockito 2.18.3模拟Final类时的NoClassDefFoundError问题

你遇到的这个问题是Mockito 2.x模拟final类的典型配置缺失场景——Mockito默认不支持final类的mock,再加上可能的依赖或版本兼容问题,才会导致初始化失败抛出NoClassDefFoundError。下面是一步步的解决办法:

1. 补充Mockito内联依赖

Mockito 2.x开始支持final类,但需要引入mockito-inline依赖(它包含核心的mockito-core功能,同时提供内联mock能力)。根据你的构建工具添加对应依赖:

Maven

pom.xml的test依赖中添加:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>2.18.3</version>
    <scope>test</scope>
</dependency>

如果之前已经引入mockito-core,可以直接替换成这个,或者保留但要确保版本一致。

Gradle

build.gradle的test依赖中添加:

testImplementation 'org.mockito:mockito-inline:2.18.3'

2. 启用Inline Mock Maker

光加依赖还不够,需要告诉Mockito使用内联模式处理final类。在测试资源目录下创建如下结构的文件:

  • 路径:src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
  • 文件内容:
mock-maker-inline

这个文件会让Mockito加载内联mock生成器,从而支持final类、静态方法等的模拟。

3. 解决Spring Boot与Mockito的版本兼容问题

从报错信息看你在使用Spring Boot测试框架,要注意spring-boot-starter-test默认会引入Mockito,如果它自带的版本和你手动指定的2.18.3不一致,可能出现依赖冲突。

Maven中排除自带的Mockito

如果Spring Boot自带的Mockito版本低于2.18.3,先排除它再引入mockito-inline

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

然后再添加前面的mockito-inline依赖即可。

Gradle中排除自带的Mockito

testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.mockito', module: 'mockito-core'
}
testImplementation 'org.mockito:mockito-inline:2.18.3'

完成这些步骤后,再尝试模拟你的final类,应该就能正常运行了。

内容的提问来源于stack exchange,提问作者Pradeep Simha

火山引擎 最新活动