Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 已捕获并处理异常的单元测试_Java_Unit Testing_Exception_Mocking_Mockito - Fatal编程技术网

Java 已捕获并处理异常的单元测试

Java 已捕获并处理异常的单元测试,java,unit-testing,exception,mocking,mockito,Java,Unit Testing,Exception,Mocking,Mockito,我编写了一个使用BufferedReader和FileReader的方法,其结果是需要处理FileNotFoundException和IOException 现在,我在类中使用try-and-catch语句来处理异常,这样就没有问题了 我遇到的问题是编写一个测试来验证是否捕获了异常 我无法按如下方式编写测试,因为我的方法已捕获异常,因此它不会传播以在测试中处理: @Test(expected = FileNotFoundException.class) public void testFileN

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

现在,我在类中使用try-and-catch语句来处理异常,这样就没有问题了

我遇到的问题是编写一个测试来验证是否捕获了异常

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

@Test(expected = FileNotFoundException.class)
public void testFileNotFound() {
    ...
};
如何测试异常是否已被捕获?我是否需要创建类的mock对象,并验证是否使用类似Mockitio的东西捕获了异常?还是不创建一个mock并使用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;
}
公共列表解析(字符串fileToRead){
BufferedReader fileReader=null;
List parsedData=new ArrayList();
串电流线;
试一试{
fileReader=新的BufferedReader(新的fileReader(fileToRead));
而((currentLine=fileReader.readLine())!=null){
字符串[]parsedLine=currentLine.split(“,”);
parsedData.add(parsedLine);
}
}
catch(filenotfounde异常){
logger.error(“文件不存在”,e);
}
返回数据;
}

我认为这是一个试图对抗语言而不是使用它的经典例子。它也可能是设计上不太可测试的代码示例

首先,理解已检查异常和未检查异常之间的概念差异很重要。未经检查的异常,如
NullPointerException
ArrayIndexOutOfBoundsException
是“未经检查的”(这意味着编译器不关心它们),因为当抛出它们时,通常是程序员的错误。在方法调用之前,通常可以使用if语句轻松防范这些类型的异常<另一方面,code>IOException和
FileNotFoundException
是“选中”的(这意味着编译器会抱怨缺少catch/throw),因为即使在尝试读取文件之前使用
file#exists()
方法检查文件是否存在,在此期间可能会发生外部事件,导致文件丢失,或者在读取计算机上的文件时,可能会从计算机中取出一个硬盘驱动器。选中的异常通常表示一种崩溃状态,您必须明确决定如何从中恢复,并且只有您(作为程序员)才能做出该决定

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


第二,可测试性问题(这可能是问题,也可能不是问题,取决于您的设置)。在
catch
-子句中发生的唯一一件事(以及引发和捕获异常的唯一指示)是臭名昭著的“记录并忘记”策略。您正在记录错误(而不是在适当的情况下处理/响应错误),因此为了验证是否捕获了异常,您唯一的实际选择是模拟记录器(如果您的设计允许)并验证是否调用了其
error()
方法。如果您的目标是验证在给定特定输入的情况下是否引发异常,那么您不能只检查输出,因为这只是验证输出—一个完全不同的测试。您必须检查抛出的异常导致的代码路径是否已被采用,在本例中,一种方法是模拟记录器。

我认为这是一个尝试使用该语言而不是使用该语言的经典示例。它也可能是设计上不太可测试的代码示例

首先,理解已检查异常和未检查异常之间的概念差异很重要。未经检查的异常,如
NullPointerException
ArrayIndexOutOfBoundsException
是“未经检查的”(这意味着编译器不关心它们),因为当抛出它们时,通常是程序员的错误。在方法调用之前,通常可以使用if语句轻松防范这些类型的异常<另一方面,code>IOException和
FileNotFoundException
是“选中”的(这意味着编译器会抱怨缺少catch/throw),因为即使在尝试读取文件之前使用
file#exists()
方法检查文件是否存在,在此期间可能会发生外部事件,导致文件丢失,或者在读取计算机上的文件时,可能会从计算机中取出一个硬盘驱动器。选中的异常通常表示一种崩溃状态,您必须明确决定如何从中恢复,并且只有您(作为程序员)才能做出该决定

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

第二,可测试性问题(可能是,也可能是