[英]Junit Test case of method that already has a try-catch clause
我正在嘗試為類ErParser中的方法setTrailer()
編寫一個測試用例。 setTrailer()
具有try-catch子句,並且在其一個catch子句中,它捕獲NullPointerException
。 我正在嘗試為setTrailer()
拋出並捕獲NullPointerException
的情況編寫Junit測試,但測試用例仍然失敗。 是因為我已經在方法本身中捕獲了異常嗎? 我應該在測試用例中捕獲異常嗎?
測試用例:
public class TestERParser {
@Test(expected=NullPointerException.class)
public void nullSetTrailer() {
ERParser recCurrParse = new ERParser();
recCurrParse.setTrailer(null);
}
}
ERParser類中的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();
}
}
}
我們可以爭論這個catch塊是否意味着處理了異常。 我認為僅僅打印堆棧跟蹤不會處理任何事情。 最好在方法簽名中添加throws子句,讓客戶決定如何處理異常。
如果方法是以這種方式編寫的,那么由你自己來測試它。 如果這是第三方庫,您將無法選擇。
編寫拋出異常的測試; trailerRecord
表示trailerRecord
設置為null
。
您的代碼有另一個缺陷:關閉finally塊中的流。 您可能無法正確關閉輸入流。
正如您所懷疑的那樣,您正在捕獲代碼中的NPE並且它沒有被傳播。 如果您希望用戶捕獲此異常,則應刪除此代碼並使用throws將方法裝飾到適當的類。
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();
}
由於您的代碼現在拋出一個已檢查的Exception,您需要稍微更新您的Junit方法,以捕獲已檢查的異常
@Test(expected=NullPointerException.class)
public void nullSetTrailer() throws Exception {
ERParser recCurrParse = new ERParser();
recCurrParse.setTrailer(null);
}
在您的測試用例中,期待一個NullPointerException類。 如果你抓住它,調用者類將無法獲得它。 因此,您可以刪除try / catch塊,也可以在打印stacktrace后重新拋出異常:
catch (NullPointerException exception) {
exception.printStackTrace();
throw new NullPointerException();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.