用Java编写单元测试文件,不使用接口包装器

用Java编写单元测试文件,不使用接口包装器,java,unit-testing,junit,Java,Unit Testing,Junit,我有一个现有的Java类,可以写入文件 public final class WriteToFile{ private Writer file_writer; private static final String encoding_format = "UTF8"; private FileWrite(final File fpath) throws IOException { this.file_writer = new OutputStreamWri

我有一个现有的Java类,可以写入文件

public final class WriteToFile{

    private Writer file_writer;
    private static final String encoding_format = "UTF8";
    private FileWrite(final File fpath) throws IOException {
        this.file_writer = new OutputStreamWriter(new FileOutputStream(fpath), encoding_format);
    }

    @Override
    public void fileWrite(final String msg) {
        try {
            this.file_writer.write(msg);
            this.file_writer.write("\n");
            this.file_writer.flush();
        this.file_writer.close();
        } catch (IOException e) {
            log.error("File write failed", e);
        }
    }

    }
为了进行单元测试,我了解到使用模拟框架创建文件模拟不是一个好的实践。我在这里测试什么?测试这一点的唯一方法是可能再次写入文件,并检查预期内容和实际内容是否相同。在这种情况下,以JUnit的方式进行操作将如本文所述。但是,我不打算重写文件编写代码,以包含接口包装器。我该怎么做呢

@Test public void testfileWrite() {
  String msg = "somemessage";
  String fpath = "path/to/file";
  Writer file_writer = new OutputStreamWriter(new FileOutputStream(fpath), "UTF8");
  file_writer.write(msg);
  assertEquals("somemessage", file_writer.toString()); 
}

这就是需要测试的全部内容吗?

使用Powermockito模拟对FileOutputStream和OutputStreamWriter构造函数的调用,如下所示:


然后验证文件写入器方法writeString和flush分别被调用了两次和一次;最后结束。

本课程的重点是编写一个文件。它不做其他事情,这是一件好事。因此,不要为模拟程序单元测试而烦恼,它所显示的只是您可以编写大量模拟代码。而是编写一个集成测试

使用JUnit规则创建并销毁一个文件夹,将测试文件放入其中,然后在测试结束时验证该文件是否包含您想要的内容。你唯一应该考虑嘲讽这种测试的是,如果例外的情况做了一些事情。然后,您可以执行一些邪恶的黑魔法,包括或通过某种形式的文件流工厂。或者问问自己,对于需要测试的复杂逻辑来说,这是否真的是一个非常好的地方,然后移动它


当测试使用WriteToFile、mock或stub WriteToFile的类时。

当要编写必须检查生成文件的单元测试时,我总是为自己准备一个案例库:对于每个案例,必要时一个输入文件,以及一组预期的输出文件

我为每种情况编写一个测试方法,在这里我调用业务逻辑,它将在工作目录中生成一个或一些文件,并最终检查生成的文件是否等于正确的预期文件

我手动准备预期的文件,并将它们签入源代码管理系统,以便它们属于每个发布版本。如果将来业务逻辑必须更改其行为,则需要相应地更改预期文件,并在同一版本中检入代码和文件并将其标记在一起


这是我找到的检查生成文件的最简单、最安全的方法。

您的测试并不是在测试您的类……您到底在测试什么?