我的基类使用负责审计的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
}
到目前为止,我已经尝试了两种方法
1)创建了LoadingCache
并将示例值放入其中,以便UnitTest可以在以后的执行中使用它。
longLoadingCache.put("4028eeb0-1d2d-daba-011d-2e36e4b2110e",(long)203);
longLoadingCache.put("4028ee14-24b4-5221-0124-b47bbb1d1232",(long)102);
2)@Mock
的{{1}}对象及其中的值,供以后在测试中使用
LoadingCache
以上两种方法的电流输出
when(longLoadingCache.get("4028eeb0-1d2d-daba-011d-2e36e4b2110e")).thenReturn((long)203);
when(longLoadingCache.get("4028ee14-24b4-5221-0124-b47bbb1d1232")).thenReturn((long)102);
所以我的问题是,如何传递/模拟Cache的值,以便UnitTest不必在Library类中查找值。
答案 0 :(得分:1)
请考虑创建包装第3方库(例如AuditProcessor)的外观bean。使用@Autowire或@Inject注入外观时,您可以轻松地在测试代码中对其进行模拟,并检查包装的外观(阅读:库)是否已正确使用。如果您不信任该库,则可以在没有HSQL的隔离环境中对包装外观和所有角落情况进行单元测试。如果您想要更多的控制权,可以引入一个接口(例如IAuditProcessor)并创建一个虚拟实现,该实现将在使用Spring配置文件的测试中通过@Autowired
进行测试。总结:
答案 1 :(得分:1)
尽管@Lukasz的回答是完全正确的,但需要付出更多的努力。花了几个小时后,我能够为这个问题创建更简单的解决方案。
与其@Mock
{ing {1}},不如LocalCache
类(Library类)提供缓存值,因为它们是静态值,我们不在乎库本身如何检索它。
像这样
@Mock
在 busAuditOperationDao = mock(BusAuditOperationDao.class);
busAuditProcessDao = mock(BusAuditProcessDao.class);
方法中,我可以指定所需的任何值,这些值将在@Before
类中使用
@test