如何对读取给定文件的方法进行unit testing

我知道这有点天真。 如何在不给物理文件作为输入的情况下对这段代码进行unit testing。 我是模拟和unit testing的新手。 所以我不确定。 请帮忙。

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(); } } 

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

 public String fileToString(BufferedReader input) throws IOException 

它会更容易测试。 您将业务逻辑从读取文件的技术性中分离出来。 据我所知,您的业务逻辑是读取流并确保行结尾是unix样式。

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

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

JUnit确实有一个很好的function,用于创建用于测试的文件,并使用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 } } 

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

您可以使用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){ } } }