如何比较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可以分析文件是否正确形成。
如果您无法控制将输出放在流中的方法,那么我会说您需要重构代码,以便方法在参数(或其类的构造函数)中接收流。
之后,测试非常简单 – 您只需检查流。 易于测试的代码通常等于良好的代码。