我想在我正在研究的一个小项目上实现JUnit,因为我想了解一点。
我读过的教程都引用了具有特定输出的方法。
在我的情况下,我的输出是文件,我该怎么做?任何简单的例子? 任何可以帮助我的方法吗?
这些文件是由void私有方法构建的原始文本文件。
答案 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)
虽然你的问题可能看似简单化,但它确实触及了单元测试的核心,但是需要编写可测试的格式良好的代码。这就是为什么一些专家建议首先编写单元测试然后再编写实现类。
在您的情况下,我建议您允许您的方法执行并创建预期的文件,然后您的单元测试可以分析文件是否正确形成。