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; 
    } 
+1

如果你想覆盖'catch'块中的代码,你的测试需要在'try'块中引发一个异常。 – khelwood

+0

您必须设置您的测试,以便它会抛出异常。 – Abubakkar

+0

我认为这可以帮助你[单元测试例外](http://*.com/questions/156503/how-do-you-assert-that-a-certain-exception-is-thrown-in-junit-4 - 测试) – java4fun

您可以mockproductCacheDaoproductDao和检查这些方法进行了多少次在你的测试用例调用。你可以模拟异常与模仿对象抛出,就像这样:

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()); 
    } 
} 
+0

如果我嘲笑并期待异常,因为你给了链接它将覆盖catch块的代码。 – John

+0

你可以嘲笑这两种方法:'productCacheDao'和'productDao'。然后,您应该有两个测试用例:一个用于使用'productCacheDao',另一个用于'productCacheDao'引发异常并使用'productDao'。在这些情况下,你可以检查你的方法被'verify'方法调用了多少次。看例如这个问题:http://*.com/questions/27787487/java-verify-void-method-calls-n-times-with-mockito – esin88

+0

@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)); 
    } 
}