Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较JUnit测试用例中的文件?_Java_Unit Testing_Junit_Text Files - Fatal编程技术网

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

Java 如何比较JUnit测试用例中的文件?,java,unit-testing,junit,text-files,Java,Unit Testing,Junit,Text Files,我想在我正在从事的一个小项目上实现JUnit,因为我想了解一下它 我阅读的教程都参考了具有特定输出的方法 在我的情况下,我的输出是文件,我如何才能做到这一点?有简单的例子吗? 有什么方法可以帮我解决这个问题吗 这些文件是由void private方法生成的原始文本文件。方法写入文件后,在单元测试中,您可以读取文件并验证是否正确写入 另一件有意义的事情是将您的方法拆分为一个检索数据并将其返回给只将其写入文件的方法。然后可以验证第一个方法返回的数据是否正常 另一种可行的方法是将OutputStrea

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

我阅读的教程都参考了具有特定输出的方法

在我的情况下,我的输出是文件,我如何才能做到这一点?有简单的例子吗? 有什么方法可以帮我解决这个问题吗


这些文件是由void private方法生成的原始文本文件。

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

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


另一种可行的方法是将
OutputStream
传递给写入数据的方法。在“真实代码”中,您可以传递
文件输出流
/
文件编写器
,而在测试代码中,您可以编写
输出流
的模拟实现,并检查写入的内容。

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


在这之后,测试就相当容易了——您只需检查流即可。易于测试的代码通常等于好代码。

您希望为给定的一组输入获取正确的输出文件,并设置一个测试,用这些输入调用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进行方便的文本文件比较,并使用JUnit确保在测试运行之前输出文件永远不存在。

尽管您的问题看起来过于简单,但它确实触及到了单元测试的核心,您需要编写格式良好的可测试代码。这就是为什么一些专家建议首先编写单元测试,然后编写实现类

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

使用来自的类。其他链接:

  • (可通过搜索)
方法之一:

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

这些方法如何写入文件?如果他们得到一个流,你可以给他们你自己的,而不是一个指向文件的流,然后比较它。在网络爬虫中,基本写缓冲字符串(我按enter键,但它写了消息)的代码类似于:txturlsecial.write(bigText.charAt(j));谢谢,我将在下次首先进行单元测试时考虑到这一点:d编写整个文件的代码可能太大太复杂了。JUnit可能会显示代码是否仍然有效(没有回归),这是一个问题。然而,真正好的单元测试也有助于发现什么是坏的。问题是,实际上它不生成单个文件,而是根据不同的内容生成3到5个文件。但是因为我对junit非常熟悉,所以我想先用一个文件来尝试一下,以便完全理解它。Thank=D.@Saikios这与任何数量的文件都相关:)我喜欢这个,但为什么没有人投票支持你的答案呢SyyourSelfEclipse说org.junit.internal.runners.TestClass是不推荐的=(您应该只需要导入
junit.framework.Assert
&
org.junit.Test
,是否使用junit 4?我猜此方法的使用必须限于短文件,因为输出可读性差。例如,没有关于行号的信息。受保护的静态void assertEquals(java.lang.String消息,预期为java.io.Reader,实际为java.io.Reader)