2013-09-24 62 views
0

我正在嘗試爲類ErParser中的方法setTrailer()編寫測試用例。 setTrailer()有try-catch子句,並且在其中一個catch子句中,它捕獲NullPointerException。我試圖爲setTrailer()引發並捕獲NullPointerException的情況編寫Junit測試,但測試用例仍然失敗。是否因爲我已經在方法本身中發現了異常?我應該在測試用例中捕捉異常嗎?Junit已經有try-catch子句的方法的測試用例

測試案例:ERParser類內

public class TestERParser { 
    @Test(expected=NullPointerException.class) 
    public void nullSetTrailer() { 
     ERParser recCurrParse = new ERParser(); 
     recCurrParse.setTrailer(null); 
    } 
} 

setTrailer()方法:

public class ERParser { 
private static final String TRAILER_E = "GRAND TOTAL"; 
private static final String TRAILER_R = "TRAILER"; 
public String trailerRecord; 

/** 
* Constructs an ERParser object. 
*/ 
public ERParser() { 
    this.trailerRecord = null; 
    this.trailerVals = null; 
} 
/** 
* Populates the trailerRecord field with the summary (trailer) record of the input file. 
* @param file Input file 
* @throws NullPointerException, FileNotFoundException, IOException 
*/ 
public void setTrailer(File file) { 
    try { 
     FileReader fReader = new FileReader(file); 
     BufferedReader bReader = new BufferedReader (fReader); 
     String currLine = new String(); 
     readLoop: 
      while (bReader.ready()) { 
       currLine = bReader.readLine(); 
       if (currLine.contains(TRAILER_E) || currLine.contains(TRAILER_R)) { 
        break readLoop; 
       } 
      } 
     this.trailerRecord = currLine.trim(); 
     System.out.println("From setTrailer(): " + this.trailerRecord); 
     fReader.close(); 
     bReader.close(); 
    } catch (NullPointerException exception) { 
     exception.printStackTrace(); 
    } catch (FileNotFoundException exception) { 
     exception.printStackTrace(); 
    } catch (IOException exception) { 
     exception.printStackTrace(); 
    } 
} 
} 
+1

您不應該捕獲NPE;你應該完全避免它。檢查空值並且沒有NPE異常。 –

+0

通常情況下,調用者會拋出並捕獲異常,這是執行異常的最佳方式,異常可能是指外部的某種情況;想象除0操作被處理,而不是得到錯誤,它返回0或1,或任何其他值,但你想期待這種特殊情況。有了Junit,你無法在那裏做任何事情,但期待對該方法的調用。如果你拋出任何異常,那麼你可以期待異常。 – porfiriopartida

+0

我不認爲你完全理解如何從IOException中恢復,只是說。 – Woot4Moo

回答

1

正如你懷疑你正在捕捉代碼中的NPE並且它沒有被傳播。如果您希望用戶能夠捕獲此異常,則應該刪除此代碼並將您的方法拋出到適當的類中。

public void setTrailer(File file) throws Exception { 
     FileReader fReader = new FileReader(file); 
     BufferedReader bReader = new BufferedReader (fReader); 
     String currLine = new String(); 
     readLoop: 
      while (bReader.ready()) { 
       currLine = bReader.readLine(); 
       if (currLine.contains(TRAILER_E) || currLine.contains(TRAILER_R)) { 
        break readLoop; 
       } 
      } 
     this.trailerRecord = currLine.trim(); 
     System.out.println("From setTrailer(): " + this.trailerRecord); 
     fReader.close(); 
     bReader.close(); 
} 

當你的代碼現在拋出一個checked異常,你將需要稍微更新Junit的方法,抓檢查異常

@Test(expected=NullPointerException.class) 
    public void nullSetTrailer() throws Exception { 
     ERParser recCurrParse = new ERParser(); 
     recCurrParse.setTrailer(null); 
    } 
1

我們可以爭論此catch塊是否表示異常進行處理。我會爭辯說,僅僅打印堆棧跟蹤沒有處理任何事情。向方法簽名添加一個throws子句可能會更好,並讓客戶決定如何處理異常。

如果這種方法是這樣寫的,那麼由您來測試它是否寫入。如果這是第三方圖書館,你不會有選擇。

編寫引發異常的測試;成功意味着trailerRecord設置爲null

你的代碼有另一個缺陷:關閉finally塊中的流。您有可能無法像寫入那樣正確關閉輸入流。

0

在你的測試用例都期待一個NullPointerException類。如果你抓住它,調用者類將不會得到它。因此,您可以刪除try/catch塊,也可以在打印堆棧跟蹤後重新拋出異常:

catch (NullPointerException exception) { 
     exception.printStackTrace(); 
     throw new NullPointerException(); 
    } 
+2

通常你會想重新拋出現有的異常,而不是創建一個新的異常。 – Dev