如何对读取给定文件的方法进行单元测试

use*_*315 10 java junit unit-testing file mockito

我知道这有点天真.如何在不提供物理文件作为输入的情况下对这段代码进行单元测试.我是模拟和单元测试的新手.所以我不确定.请帮忙.

public static String fileToString(File file) throws IOException
{
    BufferedReader br = new BufferedReader(new FileReader(file));
    try {
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();

        while (line != null) {
            sb.append(line);
            sb.append("\n");
            line = br.readLine();
        }
        return sb.toString();
    } finally {
        br.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*rey 20

您可以创建一个文件作为测试的一部分,无需模拟它.

JUnit确实有一个很好的功能来创建用于测试的文件,并使用TemporaryFolder规则自动清理它们.

public class MyTestClass {

    @Rule
    public TemporaryFolder folder = new TemporaryFolder();

    @Test
    public void myTest() {
        // this folder gets cleaned up automatically by JUnit
        File file = folder.newFile("someTestFile.txt");

        // populate the file
        // run your test
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 但这不是针对单元测试的最佳做法,不能读取物理文件吗? (2认同)

Gui*_*ume 9

你应该重构你的方法.如您所知,将文件作为输入的方法不容易测试.此外,它似乎是静态的,这无助于可测试性.如果您将方法重写为:

public String fileToString(BufferedReader input) throws IOException
Run Code Online (Sandbox Code Playgroud)

它会更容易测试.您将业务逻辑与读取文件的技术分开.据我所知,您的业务逻辑是读取流并确保行结尾是unix样式.

如果你这样做,你的方法将是可测试的.您还可以使它更通用:它现在可以从文件,URL或任何类型的流中读取.更好的代码,更容易测试......