繁体   English   中英

单元测试,已捕获并处理了异常

[英]Unit test that an exception has been caught and handled

我编写了一个使用BufferedReader和FileReader的方法,其结果是需要处理FileNotFoundException和IOException。

现在,我在类中利用了try和catch语句来处理异常,因此那里没有问题。

我遇到的问题是编写测试以验证是否已捕获异常。

我不能编写如下测试,因为我的方法已经捕获了异常,因此它不会传播为在测试中处理:

@Test(expected = FileNotFoundException.class)
public void testFileNotFound() {
    ...
};

如何测试已捕获到异常? 我是否需要创建类的模拟对象并使用Mockitio之类的方法来验证是否已捕获异常? 还是不创建模拟并使用Mockitio监视实际对象以验证是否已捕获异常?

编辑:这是我要测试的方法...

public List<String[]> parse(String fileToRead) {

    BufferedReader fileReader = null;
    List<String[]> parsedData = new ArrayList<String[]>();
    String currentLine;

    try {
        fileReader = new BufferedReader(new FileReader(fileToRead));

        while ((currentLine = fileReader.readLine()) != null) {
            String[] parsedLine = currentLine.split(",");
            parsedData.add(parsedLine);
        }
    }
    catch (FileNotFoundException e) {
        logger.error("File does not exist", e);
    }
    return parsedData;
}

我认为这是尝试与语言打交道而不是使用语言的经典示例。 它也可能是代码的一个示例,该代码在设计上无法很好地进行测试。

首先,了解已检查和未检查的异常之间的概念区别很重要。 诸如NullPointerExceptionArrayIndexOutOfBoundsException类的未经检查的异常是“未经检查的”(意味着编译器不在乎它们),因为抛出它们时,通常是程序员的错误。 通常可以在方法调用之前使用if语句轻松防范此类异常。 另一方面, IOExceptionFileNotFoundException被“检查”(这意味着编译器将抱怨缺少捕获/抛出),因为即使在尝试读取File#exists()之前使用File#exists()方法检查文件是否存在,外部同时,可能会发生一些事件,导致文件丢失,或者在读取文件时从计算机中拉出了硬盘驱动器。 受检查的异常通常表示您必须特别确定如何从中恢复的崩溃状态,只有您(作为程序员)才能做出该决定。

考虑您的方法。 您如何通过方法的输出来判断读取操作是失败还是以空文件成功? 不能这样做 ,因为即使两个事件根本不同,您也要以完全相同的方式处理它们。 这可能是您想要的,也可能不是您想要的,但是处理这两种情况与调用方法的地方不同的情况可能更合适。 例如,您可能想向用户显示一条消息,指出“文件为空”或“文件不存在”,而不是“无数据”。

其次,可测试性问题(取决于您的设置,可能是或可能不是问题)。 catch子句中发生的唯一事情(因此是抛出并捕获到异常的唯一指示)是臭名昭著的“忘记日志”策略。 您正在记录错误(而不是在适当的地方处理/反应),因此要验证是否捕获到异常,您唯一的实际选择是模拟记录器(如果您的设计允许)并验证其error()方法是否正确。叫。 如果您的目标是验证是否在给定特定输入的情况下引发了异常 ,则您不能仅检查输出,因为那只能验证输出-完全不同的测试。 您必须检查是否采用了引发异常的代码路径,在这种情况下,一种实现方法是模拟记录器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM