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 ;
}
如果該方法捕獲異常,它不會暴露給調用方法,並且您無法測試它。你可以測試拋出的異常(通過重現你期望它發生的場景 - 如果拋出你的測試將失敗)。該方法捕獲的任何異常不是其簽名的一部分,應該被視爲實現細節,不在任何特定單元測試的範圍內。 – nbrooks
這個問題可能表明你正在測試的方法有些不對勁。如果它是一種應該返回結果的方法,那麼讓它捕獲異常,打印出消息,然後繼續下去,就好像一切都很順利,可能不是它應該做的。如果它是一種只是做東西並打印輸出或打印錯誤信息的方法,那麼無論如何將很難進行單元測試。在後一種情況下,您可能希望將該方法重構爲一個執行計算和打印結果的方法,並對第一個進行單元測試。 – ajb
你也可以發佈你的代碼嗎? – Jobin