用Java编写单元测试文件,不使用接口包装器
我有一个现有的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
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的类时。当要编写必须检查生成文件的单元测试时,我总是为自己准备一个案例库:对于每个案例,必要时一个输入文件,以及一组预期的输出文件 我为每种情况编写一个测试方法,在这里我调用业务逻辑,它将在工作目录中生成一个或一些文件,并最终检查生成的文件是否等于正确的预期文件 我手动准备预期的文件,并将它们签入源代码管理系统,以便它们属于每个发布版本。如果将来业务逻辑必须更改其行为,则需要相应地更改预期文件,并在同一版本中检入代码和文件并将其标记在一起
这是我找到的检查生成文件的最简单、最安全的方法。您的测试并不是在测试您的类……您到底在测试什么?