java - 如何使用 Mockito 在单元测试中模拟 LocalCache
问题描述
我的基类使用负责审计的 java 库。该库使用 Builder 模式从我的 Java 项目中检索对象以进行审计操作(通过自己创建键插入多个表。)该库用于com.google.common.cache
管理缓存值。即字符串和值。
LoadingCache<String, Long>
我的项目如何使用库的示例示例
auditOperation = LibraryAuditBuilder.builder()
//some param
.build()
LibraryAuditingService.process(auditOperation);
我的基本应用程序和库在 Oracle 数据库上运行,我的单元测试使用 HSQL 数据库。鉴于所有必要的脚本,@Before
我想对我的代码的执行进行单元测试。
@Before
方法
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
//create db scrips and other declarations
}
到目前为止,我已经尝试了 2 种方法
1) 创建LoadingCache
并将样本值放入其中,以便 UnitTest 稍后可以在执行中使用它。
longLoadingCache.put("4028eeb0-1d2d-daba-011d-2e36e4b2110e",(long)203);
longLoadingCache.put("4028ee14-24b4-5221-0124-b47bbb1d1232",(long)102);
2)@Mock
的对象LoadingCache
和其中的值稍后在测试中使用
when(longLoadingCache.get("4028eeb0-1d2d-daba-011d-2e36e4b2110e")).thenReturn((long)203);
when(longLoadingCache.get("4028ee14-24b4-5221-0124-b47bbb1d1232")).thenReturn((long)102);
以上两种方法的电流输出
- com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key 4028ee14-24b4-5221-0124-b47bbb1d1232.
所以我的问题是,我如何传递/模拟 Cache 的值,以便 UnitTests 不必在 Library 类中查找值。
解决方案
尽管@Lukasz 的回答完全有效,但需要付出更多的努力。花了几个小时后,我能够为这个问题创建更简单的解决方案。而不是@Mock
ing LocalCache
,我可以只@Mock
提供缓存值的类(库类),因为它们是静态值,我们不关心库本身如何检索它。类似以下的东西
busAuditOperationDao = mock(BusAuditOperationDao.class);
busAuditProcessDao = mock(BusAuditProcessDao.class);
在@Before
方法中,我可以指定我想要的任何值,这些值将在@test
类中使用
when(busAuditOperationDao.getAuditOperationIdFromGuid("4028eeb0-1d2d-daba-011d-2e36e4b2110e")).thenReturn((long) 102);
when(busAuditProcessDao.getAuditProcessIdFromGuid("4028ee14-24b4-5221-0124-b47bbb1d1232")).thenReturn((long)203);
推荐阅读
- node.js - Redis 在 WSL 上运行时会随机断开连接,但在 Linux 服务器上运行时运行良好
- c# - EF Core 3.1删除具有子关系的父实体+保存更改+在新父中重用相同的子ID =并发异常
- html - 如何在 CSS 中制作垂直扩展卡片?
- python - 如何制作多用户 Flask 应用程序
- java - 地图流操作中的投射调用不起作用
- javascript - Summernote - 如何在单击按钮时获取图像参考
- swift - 使用来自服务器的动态颜色进行 ios 应用程序主题化
- android - CollapsingToolbarLayout 在 RecyclerView 滚动时折叠不一致
- sql - 如何在 SQL Server 中的查询创建的表中添加一行?
- facebook-graph-api - 通过 API 获取私人 Instagram 用户的关注者数量