spring-boot - 为什么@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");
...
}
解决方案
缓存是使用一个代理来实现的,该代理拦截对可缓存方法的调用。当你使用时@MockBean
,Spring Boot会故意禁用代理。这样做的一个结果是不执行缓存。最近有人指出这没有很好的记录,所以我们将来可能会更新文档。
如果您想测试缓存是否按预期工作,您应该使用您的服务的真正实现,或者通过@Bean
您在问题的第一个示例中所做的方法自己创建模拟。
推荐阅读
- sql - 我有一个表,我需要根据字段参数更新或插入
- python-3.x - 如何使用 kv 语言在 Kivy 中循环?
- node.js - 使用带有 Jest 的 ws 模块模拟和测试 websocket
- .htaccess - htaccess url 错误用另一个 url 重写
- python - 根据pyspark中第一行的值填充后续的空值
- c# - 从代码隐藏设置 HTML5 可拖动属性不起作用?
- react-native - react-native-maps 使用哪个 api 以及它的成本如何?
- javascript - 用控制台中的 jquery 字符串替换 youtube 上的 favicon
- laravel - 在 cPanel 上设置 Laravel 项目
- python-3.x - Youtube Api 更新 publishAt TypeError python