为什么@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
方法自己创建模拟你问题中的例子。
为什么在使用
时缓存会被值填满@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
方法自己创建模拟你问题中的例子。