【发布时间】:2015-01-27 15:28:57
【问题描述】:
我写了一个使用BufferedReader和FileReader的方法,结果就是需要处理FileNotFoundException和IOException。
现在我在我的类中使用了 try 和 catch 语句来处理异常,所以那里没有问题。
我遇到的问题是编写一个测试来验证异常是否已被捕获。
我无法编写如下测试,因为我的方法已经捕获了异常,因此它不会传播到测试中进行处理:
@Test(expected = FileNotFoundException.class)
public void testFileNotFound() {
...
};
如何测试是否已捕获异常?我是否需要创建我的类的模拟对象并验证是否使用 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;
}
【问题讨论】:
-
expected表示您希望它被抛出。如果它被捕获,则在它被捕获后通过验证方法逻辑的其余部分进行测试。 -
向我们展示一个最小但相关的测试方法示例。
-
添加了我希望测试的方法示例
-
我认为你看错了。您无需验证异常是否被捕获。编译器和/或您的 IDE 能够解决这个问题。你需要什么——以及一个好的单元测试的重点是什么——是验证你的代码在抛出异常时是否按预期工作。例如,如果您需要区分“不存在的文件”和“空文件”,则需要针对这些情况编写测试。
-
第二个 dcsohl,您的测试没有理由检查如何您的组件是如何实现的——您只需要确保指定的输入(不存在的文件)给出正确的输出(即正常返回,没有未捕获的异常)。如果 JUnit 测试遇到未捕获的异常,它们就会失败,因此检查静默异常捕获可能只是在测试中包含一个或两个不存在的文件。但是,如果有任何可公开观察的状态或行为伴随着不存在的文件,那么您一定要明确检查。
标签: java unit-testing exception mocking mockito