簡體   English   中英

用於代碼覆蓋的java junit異常hadling

[英]java junit exception hadling for code coverage

我是java,Junit和jacoco的新手。 我正在做如下的異常處理。 我正在捕獲Exception類,以防該方法拋出之前錯過的任何其他異常。

private void myMethod1() throws MyCustomException {
    ....
    try {
        ..... straight JDBC calls for select, insert, update operations ....
    } catch (SQLException sqEx) {
        logger.error(....);
        new MyCustomException(.....);
    } catch (RuntimeException rEx) {
        logger.error(....);
        new MyCustomException(.....);
    } catch (Exception ex) {
        logger.error(....);
        new MyCustomException(.....);
    }
}

在Junit測試中,嘗試下面。 當我有運行時任何異常時,我拋出的總是會運行RuntimeException catch塊本身,除非我拋出異常。 我可以嘗試其他檢查異常,因此它進入Exception catch塊。 由於這個原因,我無法獲得所需的代碼覆蓋率。

private void testMyMethod1() {
    ....
    try {
        .....
        when(...).thenThrow(new SocketException());

        spy.myMethod1();
    } catch (SQLException sqEx) {
        assertTrue(false);
    } catch (RuntimeException rEx) {
        assertTrue(false)
    } catch (Exception ex) {
        assertTrue(true);
    }
}

感謝您的幫助。

在thenThrow你已經拋出了套接字異常,但你正試圖捕獲一些其他異常,如SQLException。 如果拋出的異常不是SQLException的子代,那么它將不會進入該塊。

另外請確保在().. thenThrow()語句中通過調試創建正確的異常。有時候創建不適當的異常會導致問題。

一些事情......如果你的myMethod1()不在同一個java類中,你就無法在單獨的單元測試類中測試私有方法。 最好使myMethod1()包受到保護。 在您的測試類中,最好不要在其中包含任何try catch或if語句。 您必須為每個測試用例制作單獨的測試方法,而不是一個一個。 您可以利用@Rule@expected注釋。 我建議這樣做......

@Test(expected = MyCustomException.class)
public void testMyMethod1_handlesSQLException(){

     doThrow(SQLException.class).when(...);

     Foo foo = new Foo();
     foo.myMethod1();
}

@Test(expected = MyCustomException.class)
public void testMyMethod1_handlesRuntimeException(){

     doThrow(RuntimeException.class).when(...);

     Foo foo = new Foo();
     foo.myMethod1();
}

@Test(expected = MyCustomException.class)
public void testMyMethod1_handlesException(){

     doThrow(Exception.class).when(...);

     Foo foo = new Foo();
     foo.myMethod1();
}

在JUnit 5中,可能的方法是:

@ParameterizedTest
@ValueSource(classes = { 
  SQLException.class, 
  RunTimeException.class, 
  Exception.class
})
void methodWrapsException(Exception toBeWrapped) {
  Foo foo = new Foo(...);
  doThrow(toBeWrapped).when(...);
  assertThrows(MyCustomException.class, () -> foo.myMethod1());
}

這使得JUnit 5支持參數化類及其基於lambda的異常斷言

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM