如何比较JUnit测试用例中的文件?

我想在我正在研究的一个小项目上实现JUnit,因为我想了解一下它。

我阅读的教程都引用了具有特定输出的方法。

在我的情况下,我的输出是文件,我该怎么做? 任何简单的例子? 任何可以帮助我的方法?

这些文件是由void私有方法构建的原始文本文件。

您希望为给定的输入集获取正确的输出文件,并设置测试以使用这些输入调用void方法,然后将validation的输出文件与您的方法生成的内容进行比较。 您需要确保有一些方法来指定方法输出的位置,否则您的测试将非常脆弱。

@Rule public TemporaryFolder folder = new TemporaryFolder(); @Test public void testXYZ() { final File expected = new File("xyz.txt"); final File output = folder.newFile("xyz.txt"); TestClass.xyz(output); Assert.assertEquals(FileUtils.readLines(expected), FileUtils.readLines(output)); } 

使用commons-io FileUtils进行方便的文本文件比较和JUnit的TemporaryFolder,以确保输出文件在测试运行之前永远不存在。

使用junit-addons项目中的 junitx.framework.FileAssert类。 其他链接:

  • API
  • pom (可通过http://search.maven.org搜索)。

其中一种方法:

 assertEquals(java.lang.String message, java.io.Reader expected, java.io.Reader actual) 

在您的方法编写文件后,在unit testing中,您可以读取文件并validation它是否正确写入。

另一个有意义的事情是将您的方法拆分为一个,检索该数据并将其返回给仅将其写入文件的方法。 然后,您可以validation第一种方法返回的数据是否正常。

另一种似是而非的方法是将OutputStream传递给写入数据的方法。 在“真实代码”中,您可以传递FileOutputStream / FileWriter ,而在测试代码中,您可以编写OutputStream的模拟实现并检查正在写入的内容。

虽然你的问题可能看似简单化,但它确实触及了unit testing的核心,但是需要编写可测试的格式良好的代码。 这就是为什么一些专家建议首先编写unit testing然后再编写实现类。

在您的情况下,我建议您允许您的方法执行并创建预期的文件,然后您的unit testing可以分析文件是否正确形成。

如果您无法控制将输出放在流中的方法,那么我会说您需要重构代码,以便方法在参数(或其类的构造函数)中接收流。

之后,测试非常简单 – 您只需检查流。 易于测试的代码通常等于良好的代码。