簡體   English   中英

Junit已經有try-catch子句的方法的測試用例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM