2017-09-27 35 views
0

假設我測試了一個依賴於另一個我們不想或不能直接測試的方法的類方法,該方法處理一個checked例外,在以下的方式:現在如果斷言如果它已被使用/處理/捕獲,則拋出異常

public class A { 

    public void process(){ 
     if (isProcessingSuccessful()){ 
      LOG.info("Success"); 
     } 
     else { 
      LOG.error("Fail"); 
     } 
    } 

    private boolean isProcessingSuccessful(){ 
     try{ 
      doSomeOtherStuff(); 
      return true; 
     } 
     catch (Exception e){ 
      return false; 
     } 
    } 
} 

,如果我對A#過程(一個測試類測試),如:

@Test 
public void shouldFailDueToCommandGatewayError() { 
    A a = new A(); 
    // setting up preconditions 

    //testing here 
    a.process(); 

    //Now, assert exception was thrown during the course of a.process() execution, something like 
    exception.expect(NullPointerException.class); 
    // ?? how to do that? 
} 

TLTD:它是可以寫入單獨的測試isProcessingSuccessful()或者做類似的事情,但讓我們說這個方法不能用於測試,li它在圖書館中是私密的嗎?

鑑於上述限制,是否有任何方式來編寫測試,以確定如上所述的基礎方法中拋出的異常?

回答

2

不,junit無法辨別拋出的異常,因爲它被被測代碼吃掉了。爲了檢測發生了什麼,您必須檢查寫入日誌的內容。將appender替換爲寫入它的內容,然後測試可以驗證測試結束時寫入的內容。

+0

至少有人閱讀OPs代碼(不像其他三種)。 OP也可以嘗試模擬'doSomeOtherStuff()(當它使用來自不同類的東西)並強制執行異常。 「**」 - Bah,不,不要這樣做:/ – Tom

+1

恕我直言,如果其他三個人獨立解釋答案相同和錯誤,它會顯示這個問題不像它看起來那麼清楚。顯然,在一系列指責後的第四個嘗試以不同的方式解釋這個問題。所以我不明白你的嘆氣。 –

+0

@Tom:我刪除了你所抱怨的部分,因爲OP已經覆蓋了問題中的內容。 –

0

您無法再捕獲已經消耗的異常。唯一的方法是用下面描述的測試方法來捕捉異常。

註釋應該失敗的測試方法@Test並使用expected參數作爲預期的異常。

@Test(expected = NullPointerException.class) 
public void shouldFailDueToCommandGatewayError() { 

    // something that throws NullPointerException 
} 
+0

這顯然不適用於OP代碼/上下文。 – Tom

-1
@Test(expected = NullPointerException.class) 

這基本上說:

如果這個測試與一個NullPointerException那麼一切都如預期退出。否則,此測試將失敗。

+1

你能解釋一下爲什麼你認爲異常會到達測試類,儘管它已清楚地看到OP已經在代碼中捕獲它了嗎? – Tom

-1
@Test(expected = NullPointerException.class) 

已被提及。此功能來wuth JUnit 4中在此之前,如果你想要做的要檢查不是被拋出的異常的只是一個特定類型的更多,你可以做這樣的事情:

try { 
    doSometing("", ""); 
    fail("exception expected"); 
} 
catch(IllegalArgumentException iae) { 
    assertEquals("check message", "parameter a must not be empty", iae.getMessage()); 
    assertNull("check non-existance of cause", iae.getCause()); 
} 
try { 
    doSometing("someval", ""); 
    fail("exception expected"); 
} 
catch(IllegalArgumentException iae) { 
    assertEquals("check message", "parameter b must not be empty", iae.getMessage()); 
    assertNull("check non-existance of cause", iae.getCause()); 
} 

這是特別是如果同樣有用引發異常類型,並且您希望確保使用給定的參數組合引發「正確」異常。

+1

第一個建議顯然不起作用,第二個建議有幾個編譯時問題。 – Tom

+0

@Tom爲什麼會有編譯時間問題?這是JUnit 3,因爲如果你已經閱讀我的答案,你應該很清楚。 – Lothar

+0

JUnit3是石器時代。並且您的代碼反覆調用生產代碼。這也是不好的做法。如果你想知道爲什麼代碼不能編譯 - 那麼仔細閱讀它或者通過編譯器運行它。 – GhostCat

相關問題