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




