2010-09-15 35 views
17

我想在我正在开发的一个小项目上实现JUnit,因为我想了解一点。如何比较JUnit测试用例中的文件?

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

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

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

+0

怎样的方法写入文件?如果他们得到一个流,你可以给他们自己的,而不是一个指向一个文件,然后比较它。 – 2010-09-15 08:08:49

+0

whith基本写入缓冲区字符串在一个网络爬虫(我按回车但它写了消息)代码是这样的:txtUrlSpecial.write(bigText.charAt(j)); – Saikios 2010-09-15 08:12:45

回答

16

你想获得一个给定的输入,并设置一个测试打电话给你空白法这些输入正确的输出文件,然后比较反对什么你的方法产生已验证的输出文件。你需要确保你有一些方法来指定你的方法输出到哪里,否则你的测试会非常脆弱。

@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,以确保输出文件从未存在试运行之前。

+0

我喜欢这个,但为什么没有人投票给你的答案? :S – Saikios 2010-09-15 08:24:20

+2

你可以随时为它投票 – 2010-09-15 09:27:09

+0

eclipse说org.junit.internal.runners.TestClass已被弃用=( – Saikios 2010-09-15 18:21:29

2

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

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

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

1

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

之后,测试很容易 - 您可以检查流。易于测试的代码通常等同于优秀的代码。

+0

问题是,实际上它不会生成一个单独的文件,它会根据不同的事情制作3到5个文件。但是因为我真的很喜欢junit,所以我想先用一个单独的文件尝试一下,以便完全理解它。谢谢= D。 – Saikios 2010-09-15 08:20:55

+0

@Saikios这是任何数量的文件:) – 2010-09-15 08:55:52

1

虽然你的问题可能看起来过于简单,但它确实触发了单元测试的核心,需要编写可测试的格式良好的代码。这就是为什么有些专家建议先写单元测试,然后再写实施课。

在你的情况我建议你让你的方法来执行,并创建预期文件(S),随后你的单元测试(S)可以分析该文件正确形成。

+0

谢谢,下次我会记住首先进行我的单元测试:D – Saikios 2010-09-15 08:16:37

+0

编写整个文件的代码片段可能太大而且很复杂,JUnit可能会显示代码是否仍然有效(无回归),这是一件好事,但真的很好单元测试还有助于查找什么是坏 – h22 2013-06-13 19:34:52