猿问

Junit 没有捕捉到 FileNotFoundException

我遇到了一些奇怪的事情。我有一种方法可以逐行读取 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.


富国沪深
浏览 168回答 4
4回答

慕容森

您不能期望您的断言框架能够捕获在您的 SUT 中捕获的异常:catch (FileNotFoundException e) {     // TODO Auto-generated catch block     e.printStackTrace(); }你要么必须:记录然后重新抛出相同/不同的异常并断言。使您的方法返回布尔值作为成功等价物,然后您可以对其进行断言。

慕田峪4524236

你抓住了FileNotFoundException内部readData。尝试重构,这样你就没有 try-catch,并且有public void readData(String COMMA_DELIMITER, String READ_FILE_PATH) throws IOException { ...(FileNotFoundException是的子类IOException。)

繁华开满天机

assertThrows(Class<T>&nbsp;expectedType,&nbsp;Executable&nbsp;executable)不会断言在您的代码中一次抛出异常(在您的情况下是这样)。但这断言在 lambda 中调用的语句Executable抛出异常(在您的情况下为 false)。FileNotFoundException由于您在被测方法中&nbsp;捕获了异常,异常永远不会传播到 lambda 返回,JUnit 只能发出错误,因为没有遇到预期的异常。要断言这样的事情,不要通过删除语句来捕获异常catch,而不是throws&nbsp;FileNotFoundException在测试方法的声明中声明:public&nbsp;void&nbsp;readData(String&nbsp;COMMA_DELIMITER,&nbsp;String&nbsp;READ_FILE_PATH)&nbsp;throw&nbsp;FileNotFoundException&nbsp;{...}

慕勒3428872

您的方法不会抛出FileNotFoundException:您捕获它,打印堆栈跟踪,然后继续进行,就好像没有发生异常一样:catch (FileNotFoundException e) {&nbsp; &nbsp; // TODO Auto-generated catch block&nbsp; &nbsp; e.printStackTrace();}JUnit 并不神奇:它无法检测方法内部发生的事情,除了检测副作用(返回的值、未捕获的异常、变异状态)。
随时随地看视频慕课网APP

相关分类

Java
我要回答