2017-02-28 45 views
-2

我想爲下面的代碼寫一個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://stackoverflow.com/questions/156503/how-do-you-assert-that-a-certain-exception-is-thrown-in-junit-4 - 測試) – java4fun

回答

3

您可以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://stackoverflow.com/questions/27787487/java-verify-void-method-calls-n-times-with-mockito – esin88

+0

@Pavan增加了mockito的例子。在第一種情況下,你檢查你的緩存方法是否被調用過一次,並且你的DB方法從未被調用過。在第二種情況下,您的緩存方法會拋出異常,並檢查您的DB方法是否被調用過一次。 – esin88

0

你可以用嘲諷框架,如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 
     // ... 
    } 

} 
0

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