如何测试FileInputStream是否已关闭?

4

如何编写一个JUnit测试,检查FileInputStream是否已关闭?

考虑以下代码:

import java.io.FileInputStream;

class FileInputStreamDemo {

  public static void main(String args[]) throws Exception {
    FileInputStream fis = new FileInputStream(args[0]);

    // Read and display data
    int i;
    while ((i = fis.read()) != -1) {
      System.out.println(i);
    }

    fis.close();

  }
}

我想写一个像这样的测试:

@Test
public void test() {
  FileInputStreamDemo.main("file.txt");
  // test here, if input stream to file is closed correctly
}

虽然该代码示例没有太多意义,但我想知道如何编写一个JUnit测试,检查FIS是否已关闭。(如果可能:甚至没有对原始FIS对象的引用)

1个回答

4
你应该创建一个名为MyFileReader的单独类来执行文件读取任务。然后,创建一个名为MyFileReaderTest的类来实例化你的新类,并调用其中的方法来测试它是否正常运行。如果将fis设置为MyFileReader类的受保护成员,则测试可以访问fis并验证它已被关闭。
不要使用FileInputStream,而应该使用像InputStream这样的接口,这样你就可以创建一个MockInputStream,它不会真正创建文件,但会跟踪close()是否在其上调用。然后,你可以在测试代码中进行测试。

确实,这是一个不错的解决方案。如果感兴趣的方法从两个文件名创建两个FIS,您会如何处理?当第二个FIS在创建时抛出异常时,如何测试第一个FIS是否正确关闭? - Bertram Nudelbach
首先,您的MockInputStream需要有时抛出异常的能力。您可以从测试中控制它,并在其中设置一个属性,使其抛出异常。您可以在模拟对象中使用静态变量来告诉它在尝试实例化时抛出异常。更好的方法是使用工厂,您可以使用相同的方法。然后,您可以在测试中更改工厂,以使用始终抛出异常的模拟工厂。 - Sarel Botha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接