为什么@Cachable(...) 与@Bean return mock() 一起工作而不与@MockedBean 一起工作

Why does @Cachable(...) work with @Bean return mock() but not with @MockedBean

为什么在使用

时缓存会被值填满
@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");
...
}

缓存是使用拦截对可缓存方法的调用的代理来实现的。当您使用 @MockBean、Spring 启动时 intentionally disables proxying. One consequence of this is that no caching is performed. Someone recently made the point that this isn't very well documented 因此我们可能会在将来更新文档。

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