亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Junit 沒有捕捉到 FileNotFoundException

Junit 沒有捕捉到 FileNotFoundException

富國滬深 2023-06-04 17:47:10
我遇到了一些奇怪的事情。我有一種方法可以逐行讀取 CSV 文件。該方法采用文件路徑,在我的 JUnit 測試中,我使用錯誤的文件路徑測試此方法,期望得到 FileNotFoundException。問題是 JUnit5 不會拋出該異常,但在 eclipse 控制臺中我可以看到 JVM 拋出該異常,所以我很難理解為什么我已經設置了我的測試代碼來拋出異常,但它沒有被拋出。我試圖捕捉異常但仍然沒有快樂。這是方法和測試方法public void readData(String COMMA_DELIMITER, String READ_FILE_PATH) {    BufferedReader br = null;    try {        br = new BufferedReader(new FileReader(READ_FILE_PATH));        String line = "";        //Read to skip the header        br.readLine();        //Reading from the second line        while ((line = br.readLine()) != null)         {            String[] employeeDetails = line.split(COMMA_DELIMITER);            populateModel(employeeDetails);        }        //Lets print the Employee List        for(Employee e : empList)        {            System.out.println(e.getName() + "; " + e.getSurname() + "; " + e.getDateOfBirth() + "; " + e.getSex());        }    }     catch (FileNotFoundException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }    catch (IOException e) {        e.printStackTrace();    }}@Test    void testWrongFilePath() {        String READ_FILE_PATH_WRONG = System.getProperty("user.dir") + "/teest/XXXFile.csv";        System.out.println(READ_FILE_PATH_WRONG);        Assertions.assertThrows(FileNotFoundException.class, () -> {            readData.readData(COMMA_DELIMITER, READ_FILE_PATH_WRONG);        });         }在控制臺中,我得到了 FIleNotFoundException,但測試的輸出表明org.opentest4j.AssertionFailedError: Expected java.io.FileNotFoundException to be thrown, but nothing was thrown.
查看完整描述

4 回答

?
慕容森

TA貢獻1853條經驗 獲得超18個贊

您不能期望您的斷言框架能夠捕獲在您的 SUT 中捕獲的異常:

catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

你要么必須:

  • 記錄然后重新拋出相同/不同的異常并斷言。

  • 使您的方法返回布爾值作為成功等價物,然后您可以對其進行斷言。


查看完整回答
反對 回復 2023-06-04
?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

你抓住了FileNotFoundException內部readData。

嘗試重構,這樣你就沒有 try-catch,并且有public void readData(String COMMA_DELIMITER, String READ_FILE_PATH) throws IOException { ...

FileNotFoundException是的子類IOException。)


查看完整回答
反對 回復 2023-06-04
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

assertThrows(Class<T> expectedType, Executable executable)

不會斷言在您的代碼中一次拋出異常(在您的情況下是這樣)。但這斷言在 lambda 中調用的語句Executable拋出異常(在您的情況下為 false)。

FileNotFoundException由于您在被測方法中 捕獲了異常,異常永遠不會傳播到 lambda 返回,JUnit 只能發出錯誤,因為沒有遇到預期的異常。

要斷言這樣的事情,不要通過刪除語句來捕獲異常catch,而不是throws FileNotFoundException在測試方法的聲明中聲明:

public void readData(String COMMA_DELIMITER, String READ_FILE_PATH) throw FileNotFoundException {...}



查看完整回答
反對 回復 2023-06-04
?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

您的方法不會拋出FileNotFoundException:您捕獲它,打印堆棧跟蹤,然后繼續進行,就好像沒有發生異常一樣:


catch (FileNotFoundException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

}

JUnit 并不神奇:它無法檢測方法內部發生的事情,除了檢測副作用(返回的值、未捕獲的異常、變異狀態)。


查看完整回答
反對 回復 2023-06-04
  • 4 回答
  • 0 關注
  • 263 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號