Tan*_*nia 0 java junit unit-testing
我有一个写入文件的现有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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了对此进行单元测试,我了解到使用Mocking框架创建文件模拟并不是一个好习惯.我在这里测试什么?测试这个的唯一方法是再次执行文件写入,并检查预期内容和实际内容是否相同.在这种情况下,以JUnit方式执行此操作将如本文中提到的如何在Java中测试写入文件?.但是,我不打算重写文件编写代码,以包含接口包装器.我该如何解决这个问题?
@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());
}
Run Code Online (Sandbox Code Playgroud)
这一切都需要测试吗?
这个类的重点是编写一个文件.它没有别的(这是一件好事).因此,不要打扰一个mockist单元测试,它显示的是你可以编写大量的模拟代码.而是编写集成测试.
使用JUnit规则TemporaryFolder
创建和销毁文件夹以放入测试文件,然后在测试结束时验证文件是否包含您想要的文件.你应该考虑嘲笑这种测试的唯一一次是如果特殊情况做了一些时髦的事情.然后你可以做一些涉及Powermock的邪恶黑魔法或通过某种形式的"文件流工厂".或者问问自己,对于需要测试的复杂逻辑来说,这是否真的是一个非常好的地方,然后移动它.
测试使用WriteToFile
,模拟或存根的类时WriteToFile
.