Spring Boot单元测试Mockito版本兼容报NoSuchMethodError问题求助
问题根因
你遇到的两类报错由两个独立问题叠加导致:
- 测试代码写法错误:
@Autowired和@InjectMocks注解混用、Mock方法未打桩,导致初始的空指针异常 - 手动指定的Mockito版本与当前Spring Boot版本内置的测试依赖不兼容,导致后续全量测试时报
NoSuchMethodError
解决步骤
第一步:修正测试代码错误
将测试代码调整为如下写法:
@SpringBootTest public class LabelCacheTest { @MockBean private LabelRepository labelRepository; // 只保留@Autowired,删除@InjectMocks // @MockBean已经会自动将Mock实例注入Spring上下文管理的LabelServiceImpl中,不需要Mockito额外注入 @Autowired private LabelServiceImpl labelService; @Test public void test_for_Cache() { // 必须给Mock方法打桩指定返回值,否则调用时会返回null,触发后续逻辑空指针 List<Label> mockLabels = new ArrayList<>(); // 按需构造测试数据,比如添加自定义的Label实例 when(labelRepository.findAllLabels()).thenReturn(mockLabels); List<LabelDTO> resultFromDatabase = labelService.findAll(); List<LabelDTO> resultFromCache = labelService.findAll(); verify(labelRepository, times(1)).findAllLabels(); assertEquals(resultFromDatabase, resultFromCache); } }
第二步:解决Mockito版本冲突
- 删掉
pom.xml中手动添加的mockito-core依赖,直接使用spring-boot-starter-test内置的兼容版本即可,Spring Boot官方已经做好了版本适配,不会出现方法找不到的问题 - 如果确实需要指定Mockito版本,需和当前Spring Boot版本的依赖声明保持一致:
- 执行命令
mvn dependency:tree | grep mockito查看当前Spring Boot管理的Mockito版本号 - 手动指定的版本必须和上述查询到的版本完全一致
- 执行命令
- 清理本地Maven仓库中缓存的异常Mockito版本,执行
mvn clean install重新构建项目即可
内容的提问来源于stack exchange,提问作者user16979464
相关产品推荐
相关产品推荐

