JUnit为try和catch块覆盖率
我想为下面的代码写一个JUnit,但我没有得到任何想法如何涵盖写在catch块语句中的代码。请任何人为下面的代码写一个示例JUnit。JUnit为try和catch块覆盖率
在这里,我不想覆盖任何异常,但不想覆盖使用Mockito编写的catch代码行代码。
public Product getProductLookUpData() {
Product product = null;
try{
// Try to get value from cacheable method
product = productCacheDao.getProductLookUpData();
.....//statements
} catch (Exception ex) {
// getting value from db
product = productDao.getIpacMetricCodeLookUpData();
....//statements
}
return product;
}
您可以mock都productCacheDao
和productDao
和检查这些方法进行了多少次在你的测试用例调用。你可以模拟异常与模仿对象抛出,就像这样:
when(mockObject.method(any())).thenThrow(new IllegalStateException());
所以,你的情况我会做这样的事情:
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static org.mockito.Mockito.*;
public class ProductTest {
private static final Product CACHED_PRODUCT = new Product("some parameters for cached product");
private static final Product DB_PRODUCT = new Product("some parameters for DB product");
private ProductService service;
private ProductDao productDaoMock;
private ProductCacheDao productCacheDaoMock;
@Before
public void setup() {
service = new ProductService();
productDaoMock = mock(ProdoctDao.class);
service.setProductDao(productDaoMock);
productCacheDaoMock = mock(ProdoctCacheDao.class);
service.setProductCacheDao(productCacheDaoMock);
}
@Test
public void testCache() {
when(productCacheDaoMock.getProductLookUpData(any())).thenReturn(CACHED_PRODUCT);
final Product product = service.getProductLookUpData();
Assert.assertEquals(CACHED_PRODUCT, product);
verify(productCacheDaoMock, times(1)).getProductLookUpData(any());
verify(productDaoMock, never()).getIpacMetricCodeLookUpData(any());
}
@Test
public void testDB() {
when(productCacheDaoMock.getProductLookUpData(any())).thenThrow(new IllegalStateException());
when(productDaoMock.getIpacMetricCodeLookUpData(any())).thenReturn(DB_PRODUCT);
final Product product = service.getProductLookUpData();
Assert.assertEquals(DB_PRODUCT, product);
verify(productCacheDaoMock, times(1)).getProductLookUpData(any());
verify(productDaoMock, times(1)).getIpacMetricCodeLookUpData(any());
}
}
如果我嘲笑并期待异常,因为你给了链接它将覆盖catch块的代码。 – John
你可以嘲笑这两种方法:'productCacheDao'和'productDao'。然后,您应该有两个测试用例:一个用于使用'productCacheDao',另一个用于'productCacheDao'引发异常并使用'productDao'。在这些情况下,你可以检查你的方法被'verify'方法调用了多少次。看例如这个问题:http://stackoverflow.com/questions/27787487/java-verify-void-method-calls-n-times-with-mockito – esin88
@Pavan增加了mockito的例子。在第一种情况下,你检查你的缓存方法是否被调用过一次,并且你的DB方法从未被调用过。在第二种情况下,您的缓存方法会抛出异常,并检查您的DB方法是否被调用过一次。 – esin88
你可以用嘲讽框架,如Mockito
在你的JUnit测试中,你可以做类似
public class YourTest {
private ProductcacheDao productCacheDaoMock;
@Before
public void setup() throws Exception {
productCacheDaoMock = Mockito.mock(ProductcacheDao.class);
}
@org.junit.Test
public void test() {
// Given
Mockito.when(productCacheDaoMock.getProductLookUpData()).thenThrow(new RuntimeException());
// When
// do your stuff
productCacheDaoMock.getProductLookUpData();
// Then
// ...
}
}
Mockito,或另一个模拟框架可以使用。你将需要两个测试用例 - 有和没有抛出异常。你可以模拟你的DAO返回一个已知的对象,这样你就可以验证你的服务正在展现正确的行为。
我已经在下面写了一个完整的例子。
public class MocksExample {
private ProductService service;
@Mock
private ProductDao productDao;
@Mock
private ProductCacheDao productCacheDao;
@Mock
private Product product;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
service = new ProductService();
service.setProductCacheDao(productCacheDao);
service.setProductDao(productDao);
}
@Test
public void serviceReturnsProduct() {
when(productCacheDao.getProductLookUpData()).thenReturn(product);
assertThat(service.getProductLookUpData(), is(product));
}
@Test
public void ipacProductReturnedWhenDaoThrowsException() {
when(productDao.getIpacMetricCodeLookUpData()).thenReturn(product);
when(productCacheDao.getProductLookUpData()).thenThrow(new IllegalStateException("foo"));
assertThat(service.getProductLookUpData(), is(product));
}
}
如果你想覆盖'catch'块中的代码,你的测试需要在'try'块中引发一个异常。 – khelwood
您必须设置您的测试,以便它会抛出异常。 – Abubakkar
我认为这可以帮助你[单元测试例外](http://stackoverflow.com/questions/156503/how-do-you-assert-that-a-certain-exception-is-thrown-in-junit-4 - 测试) – java4fun