【问题标题】:Why does @Cachable(...) work with @Bean return mock() but not with @MockedBean为什么@Cachable(...) 可以与@Bean return mock() 一起使用,但不能与@MockedBean 一起使用
【发布时间】:2021-11-15 19:23:19
【问题描述】:

为什么使用时缓存会被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-boot mockito spring-boot-test spring-bean spring-cache


    【解决方案1】:

    缓存是使用代理来实现的,该代理拦截对可缓存方法的调用。当你使用@MockBean 时,Spring Boot intentionally 会禁用代理。这样做的一个结果是不执行缓存。有人recently made the point that this isn't very well documented,所以我们将来可能会更新文档。

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

    【讨论】:

    • 谢谢安迪。我查看了 javadocs,这将是一个指出这一点的好地方,或者我只是监督了它。我确实知道如何解决这个问题,但我想了解背景中发生的事情,这使它更清楚。
    猜你喜欢
    • 2019-06-19
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多