用途:为 Spring 缓存注解编写快速单元测试,无需 Redis 或完整 Spring 上下文,验证 @Cacheable、@CacheEvict、@CachePut 的行为。
主要能力:测试缓存命中与未命中、缓存失效、@CachePut 更新、SpEL 复合键生成,以及 unless/condition 条件缓存;通过 mock 仓库并用 verify(mock, times(n)) 断言调用次数来确认缓存是否生效。
使用方式:测试中配置内存 ConcurrentMapCacheManager,在 @BeforeEach 中 mock 仓库并创建服务实例。依赖需引入 spring-boot-starter-cache 与测试作用域的 spring-boot-starter-test(Maven 或 Gradle 均可)。典型做法是同一方法调用两次,命中时仓库仅调用一次;@CacheEvict 后再次读取应重新调用仓库;@CachePut 更新后下次读取返回新值。
适用场景:需要快速、无外部依赖地验证缓存注解语义的 Spring 项目单元测试。
限制与注意:@Cacheable 依赖代理,直接 this 调用会绕过缓存,应使用依赖注入;SpEL 复合键需保证唯一;null 结果默认会被缓存,可用 unless = "#result == null" 排除;@CachePut 总会执行方法;内存缓存无界增长,长测试需考虑 TTL;并发方面 ConcurrentMapCacheManager 线程安全,分布式缓存可能需额外配置。排查要点:确认 @EnableCaching、避免代理绕过、用 cache.getNativeKey() 调试键不匹配、在 @BeforeEach 清空缓存避免不稳定测试。