我正在编写一些 Java 代码,它使用 FileReader 从几个输入文件中加载数据。我正在大量使用 TDD,并且我想添加一些测试,以确保我在完成后通过在阅读器上调用 close() 来正确清理它。不幸的是,我想不出一个好的方法来测试这个。有人有任何见解吗?
编辑添加:我知道我可以使用模拟对象显式测试关闭调用,但如果可能的话我想避免它,部分原因是我发现它们会导致代码有些脆弱,部分原因是我很好奇它是否可能编写可以识别不关闭文件的影响的代码。)
我正在编写一些 Java 代码,它使用 FileReader 从几个输入文件中加载数据。我正在大量使用 TDD,并且我想添加一些测试,以确保我在完成后通过在阅读器上调用 close() 来正确清理它。不幸的是,我想不出一个好的方法来测试这个。有人有任何见解吗?
编辑添加:我知道我可以使用模拟对象显式测试关闭调用,但如果可能的话我想避免它,部分原因是我发现它们会导致代码有些脆弱,部分原因是我很好奇它是否可能编写可以识别不关闭文件的影响的代码。)
我认为这样做的方法是将 FileReader 或创建 FileReader 的工厂注入您的班级。然后在您的单元测试中,您可以注入 FileReader 的模拟版本并检查它是否已调用正确的方法。您可能希望查看JMock以创建模拟 FileReader 并设置对 close 方法调用的期望。
一种可行的方法是在关闭 FileReader 后测试 ready() 方法,这应该会引发异常。例如:
FileReader fr = new FileReader("somefile");
// ... file reader activity
fr.close();
// After closing the reader, the ready() method should cause an IOException:
boolean isOpen = true;
try {
isOpen = fr.ready();
} catch (IOException e) {
isOpen = false;
}
assertFalse("FileReader is still open", isOpen);
如果您可以将 FileReader 对象传递给调用,那么您可以提供一个自定义 FileReader,它具有一个覆盖的 close 方法——在这种情况下,您有一个布尔变量来检查是否关闭。然后,您可以将其用于单元测试。