Java/Spring项目单元测试缓存功能不生效该如何解决?
Spring Boot 缓存注解方法单元测试问题解决方案
问题表现
测试标注了缓存配置的LabelService业务方法时,出现两类可复现问题:
- 使用
@Autowired直接注入LabelServiceImpl实例时,抛出空指针异常 - 改用
@InjectMocks注入实例无运行报错,但缓存完全不生效:两次调用findByUuid接口均会触发LabelRepository的查询逻辑,多次调整测试类注解组合无法解决
根因定位
mockito-core 3.3.3版本与Spring Boot测试框架的缓存代理加载逻辑存在兼容性缺陷,不升级版本直接调整注解会触发java.lang.NoSuchMethodError相关报错。
解决方案
按以下步骤调整测试配置即可解决:
- 升级项目中
mockito-core依赖版本至3.7.0及以上,修复依赖兼容性问题 - 测试类添加
@SpringBootTest注解,启动Spring测试上下文保证缓存AOP切面被正常加载 - 依赖注入逻辑调整:使用
@Autowired注入LabelService接口代理实例,使用@MockBean替换上下文中的LabelRepository实现,完成Mock依赖注入
提示:Spring缓存逻辑基于动态代理实现,必须注入容器管理的代理对象,直接通过
@InjectMocks实例化的普通对象不会触发缓存切面逻辑。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

