我正在使用JUnit
编写测试用例,我也尽可能使用Mockito
API。 Collection<AppConfigTO> filteredCollection = CollectionUtils.select(configs, beanPredicate);
是我坚持测试的代码。我不能嘲笑CollectionUtils
,因为我在叮叮当时没有得到select()
。如果我不使用Mockito
,那么我应该如何根据需要更改filteredCollection
的值。我想要它的大小>0
,以便我可以覆盖Cobertura
报告中的第二个if语句。
待测方法:
public List<AppConfigTO> getAppConfig( String configCode ) {
List<AppConfigTO> list = null;
List<AppConfigTO> configs = getAppConfig();
if( configs != null ) {
EqualPredicate nameEqlPredicate = new EqualPredicate( configCode );
BeanPredicate beanPredicate = new BeanPredicate("configCode", nameEqlPredicate);
Collection<AppConfigTO> filteredCollection = CollectionUtils.select(configs, beanPredicate);
if( filteredCollection != null && filteredCollection.size()>0 ) {
list = new ArrayList<AppConfigTO>();
for( AppConfigTO to : filteredCollection ) {
list.add( to );
}
}
}else{
list = appConfigDao.getAppConfig(configCode);
}
return list;
}
JUnit测试用例:
@Test
public void testGetAppConfig() throws Exception {
AppConfigManager appManager = new AppConfigManager();
cacheProvider = new TestAppConfigManager();
IAppConfigManager configManager = Mockito.mock(IAppConfigManager.class);
IAppConfigDao configDao = Mockito.mock(IAppConfigDao.class);
List<AppConfigTO> list = new ArrayList<>();
Mockito.when(configManager.getAppConfig()).thenReturn(list);
Mockito.when(configDao.getAppConfig()).thenReturn(list);
appManager.setAppConfigDao(configDao);
list = appManager.getAppConfig(CONFIG_CODE);
assertNull(list);
assertNotNull(appManager.getAppConfigDao());
assertSame("04852",this.CONFIG_CODE);
assertNotNull(configManager.getAppConfig());
// No ConfigManager
appManager = new AppConfigManager();
cacheProvider = new TestAppConfigManager();
configManager = Mockito.mock(IAppConfigManager.class);
configDao = Mockito.mock(IAppConfigDao.class);
list = new ArrayList<>();
Mockito.when(configManager.getAppConfig()).thenReturn(null);
Mockito.when(configDao.getAppConfig()).thenReturn(null);
appManager.setAppConfigDao(configDao);
list = appManager.getAppConfig(CONFIG_CODE);
assertTrue(list.isEmpty());
assertNotNull(appManager.getAppConfigDao());
assertSame("04852",this.CONFIG_CODE);
assertNull(configManager.getAppConfig());
}
有没有办法让我可以继续进行测试。
提前致谢
答案 0 :(得分:2)
我也尽可能使用Mockito API。
而不是“尽可能”使用Mockito, 一个更好的方法是使用Mockito 没有更好的方式。
所以你想练习分支filteredCollection.size()>0
。在代码中,我看到此集合的内容由configCode
方法参数和getAppConfig()
的返回值确定。
使用可以轻松控制这些。使用适当的值来触发所需的执行路径。
请注意,测试方法testGetAppConfig
做了太多事情。
测试用例应该测试一件事。
将此方法拆分为多个独立的测试方法。
顺便说一句,这是一种更好的方法来控制AppConfigManager.getAppConfig()
返回的值,而不使用模拟:
// fill this list appropriately
final List<AppConfigTO> dummyList = Arrays.asList(...);
AppConfigManager appManager = new AppConfigManager() {
@Override
public List<AppConfigTO> getAppConfig() {
return dummyList;
}
};
这种技术被称为“扩展和覆盖”。