如何使用Mockito在单位测试中模拟本地口气



我的基类使用负责审计的Java库。该库使用构建器模式从我的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.

所以我的问题是,如何通过缓存的/模拟值,以便Unittests不必在库类中寻找值。

考虑创建自己的立面bean包装第三方库(例如AuditProcessor(。当使用@Autowire或@Inject注入外墙时,您可以轻松地在测试代码中模拟它,并检查包装外墙(读取:库(是否已正确使用。如果您不信任图书馆,则可以在没有HSQL的隔离环境中测试包装外墙和所有角色。如果您想要更多的控件,则可以引入一个接口(例如iauditProcessor(并创建一个虚拟实现,该实现将在测试中使用Spring Profiles进行@AUTOW。

总结:

  • 基于HSQL的测试应测试是否在预期时调用立面
  • 拐角案例/缓存应在没有HSQL/春季上下文的孤立测试用例中分别测试

,尽管@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);

相关内容

  • 没有找到相关文章

最新更新