首页 > 解决方案 > 为什么@Cachable(...) 可以与@Bean return mock() 一起使用,但不能与@MockedBean 一起使用

问题描述

为什么使用时缓存会充满Values

@Autowired
ServiceXY serviceXY

@TestConfiguration
static class AppDefCachingTestConfiguration {
    @Bean
    public ServiceXY ServiceXYMock() {
        return mock(ServiceXY.class);
    }
}

但不与

@MockBean
ServiceXY serviceXY

当使用@MockBean 时,在我的测试中访问缓存值时会出现 NullPointerException:

@Autowired
ConcurrentMapCacheManager cmcm; 

@Test
void anTest(){
when(serviceXY.methodThatFillsCache(anyString()).thenReturn("ABC");

serviceXY.methodThatFillsCache("TEST1");

cmcm.getCache("Cachename").get("TEST1",String.class).equals("ABC");
...
}

标签: spring-bootmockitospring-boot-testspring-beanspring-cache

解决方案


缓存是使用一个代理来实现的,该代理拦截对可缓存方法的调用。当你使用时@MockBean,Spring Boot会故意禁用代理。这样做的一个结果是不执行缓存。最近有人指出这没有很好的记录,所以我们将来可能会更新文档。

如果您想测试缓存是否按预期工作,您应该使用您的服务的真正实现,或者通过@Bean您在问题的第一个示例中所做的方法自己创建模拟。


推荐阅读