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

时间:2010-09-15 08:06:54

标签: java unit-testing junit text-files

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

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

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

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

5 个答案:

答案 0 :(得分:21)

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

@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确保输出文件在测试运行之前永远不存在。

答案 1 :(得分:3)

使用junitx.framework.FileAssert中的junit-addons project课程。其他链接:

其中一种方法:

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

答案 2 :(得分:2)

在您的方法编写文件后,在单元测试中,您可以读取文件并验证它是否写得正确。

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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