下面是代码,我想知道如何编写一个JUnit测试,以便我的覆盖范围可以覆盖catch块
import com.pkg.ClothBrandQuery;
Public class MapBrand implements SomeInterface{
public Brand mapThisBrands(final ClothBrand clothBrand) {
Brand brand = new Brand();
try{
defaultBrand = clothBrandQuery.getClothBrandMethod(ProjectConstants.DEFAULT_BRAND_KEY);
}
catch(Exception e){
logger.fatal("Database error occurred retrieving default cloth brands", e);
System.exit(2);
}
if(defaultBrand != null && defaultBrand != clothBrand){
brand.setBrandName(clothBrand.getBrandName());
brand.setCompanyName(clothBrand.getCompanyName());
brand.setBackgroundColor(clothBrand.getBackgroundColor());
}
else{
brand.setBrandName(defaultBrand.getBrandName());
brand.setCompanyName(defaultBrand.getCompanyName());
brand.setBackgroundColor(defaultBrand.getBackgroundColor());
}
}
}
我能够为mapThisBrands编写测试方法来测试品牌对象,但我不知道如何测试defaultBrand对象以及如何编写一个测试用例,其中catch块将被执行
将System.exit(2)
代码放在自己的类中,并将其存根或模拟出来,而不是直接调用该代码。这样,在测试中的将不会真正退出,但是您将知道在生产环境中它将退出。
如果你不知道怎么做(模拟或存根),你应该学习更多关于依赖注入的知识。
现在你完成了一半。另一半是使用依赖注入来模拟clothBrandQuery
。使它的getClothBrandMethod
无论如何都会抛出异常。然后你会沿着这条路走下去。Mockito是一个很好的模拟框架。
你不应该在该方法中使用System.exit(),只能在主方法中使用它,然后在mapThisBrands:
抛出异常public class MapBrand implements SomeInterface{
public static void main(String[] args) {
MapBrand map = new MapBrand();
ClothBrand clothBrand = this.getClothBrand();
try
{
map.mapThisBrands(clothBrand);
}
catch (Exception e)
{
System.exit(2);
}
}
public Brand mapThisBrands(final ClothBrand clothBrand) {
Brand brand = new Brand();
try{
defaultBrand = clothBrandQuery.getClothBrandMethod(ProjectConstants.DEFAULT_BRAND_KEY);
}
catch(Exception e){
logger.fatal("Database error occurred retrieving default cloth brands", e);
}
if(defaultBrand != null && defaultBrand != clothBrand){
brand.setBrandName(clothBrand.getBrandName());
brand.setCompanyName(clothBrand.getCompanyName());
brand.setBackgroundColor(clothBrand.getBackgroundColor());
}
else{
brand.setBrandName(defaultBrand.getBrandName());
brand.setCompanyName(defaultBrand.getCompanyName());
brand.setBackgroundColor(defaultBrand.getBackgroundColor());
}
}
}
和你的测试
public class MapBrandTestCase {
@Test (expected = java.lang.Exception.class)
public void databaseFailureShouldRaiseException()
{
Query clothBrandQuery = Mockito.mock(Query.class);
when(clothBrandQuery.getClothBrandMethod(any())).thenThrow(new Exception());
MapBrand mapBrand = new MapBrand(...);
mapBrand.mapThisBrands(aBrand);
}
}