为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信