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

时间:2013-12-20 21:07:36

标签: java file unit-testing junit 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();
    }
}

4 个答案:

答案 0 :(得分:18)

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

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
    }
}

答案 1 :(得分:8)

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

public String fileToString(BufferedReader input) throws IOException

测试会容易得多。您将业务逻辑与读取文件的技术分开。据我了解,您的业务逻辑是读取流并确保行结尾为unix样式。

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

答案 2 :(得分:3)

为什么要模拟文件?模拟java.io.File是一个坏主意,因为它有大量的原生内容。我建议你在运行单元测试时确保在类路径中有一个极简主义的文本文件。您可以将此文件转换为文本并确认输出。

答案 3 :(得分:0)

您可以使用ByteArrayInputStream和BufferedReader类的组合,在您的代码中创建所需的文件。因此,不需要在您的系统上创建真正的文件。如果您没有足够的权限(基于某些特定情况)来创建文件,会发生什么。在下面的代码中,您可以创建自己想要的文件内容:

public static void main(String a[]){

    String str = "converting to input stream"+
                    "\n and this is second line";
    byte[] content = str.getBytes();
    InputStream is = null;
    BufferedReader bfReader = null;
    try {
        is = new ByteArrayInputStream(content);
        bfReader = new BufferedReader(new InputStreamReader(is));
        String temp = null;
        while((temp = bfReader.readLine()) != null){
            System.out.println(temp);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try{
            if(is != null) is.close();
        } catch (Exception ex){

        }
    }

}