2016-11-07 156 views
0

我正在嘗試創建一個測試,以驗證我的代碼(請參閱下面的僞代碼)能夠正確捕獲異常。我知道JUnit是能夠測試代碼是否拋出具有以下代碼的異常:在JUnit中測試引發的異常

@Test (expected = ArrayIndexOutOfBoundsException.class) 

但是,我原來的我測試捕獲該異常的軟件代碼,並顯示一條消息

catch (ArrayIndexOutOfBoundsException E) { 
    System.out.print("The output should be of even length!"); 
} 

JUnit有任何方法來驗證此消息嗎?或者我應該改變我的口號?

注:我看過,我應該使用下列內容:

@Rule 
public ExpectedException thrown = ExpectedException.none(); 

@Test 
public void decodeOddLengthInput() { 
    thrown.expect(ArrayIndexOutOfBoundsException.class); 
    thrown.expectMessage("Message"); 

但程序崩潰,因爲它不能識別ExpectedException對象。

的方法,我想測試的僞代碼(不要發佈,因爲隱私原因,確切的事情):

public String decode(byte[] array){ 
try{ 
for(int i= 0; i<array.length; i= i+2){ 
//basically it crashes when input is an array of odd length (because of i=i+2) 
    get byte at array[i] and turn it into a string; 
    } 
} 
catch (ArrayIndexOutOfBoundsException E) { System.out.print("Message!");} 

    return string ; 
    } 
+0

如果該方法捕獲異常,它不會暴露給調用方法,並且您無法測試它。你可以測試拋出的異常(通過重現你期望它發生的場景 - 如果拋出你的測試將失敗)。該方法捕獲的任何異常不是其簽名的一部分,應該被視爲實現細節,不在任何特定單元測試的範圍內。 – nbrooks

+0

這個問題可能表明你正在測試的方法有些不對勁。如果它是一種應該返回結果的方法,那麼讓它捕獲異常,打印出消息,然後繼續下去,就好像一切都很順利,可能不是它應該做的。如果它是一種只是做東西並打印輸出或打印錯誤信息的方法,那麼無論如何將很難進行單元測試。在後一種情況下,您可能希望將該方法重構爲一個執行計算和打印結果的方法,並對第一個進行單元測試。 – ajb

+0

你也可以發佈你的代碼嗎? – Jobin

回答

1

你的軟件的方法是不是重新拋出異常一條消息。它只是通過打印信息來消除例外。在這種情況下,調用測試方法永遠不會知道這個異常,所以你不能測試這個場景或者驗證這個消息。