我有一个JUnit-Test将Object导出到FileSystem。首先,我的测试看起来像这样
public void exportTest {
//...creating a list with some objects to export...
JAXBService service = new JAXBService();
service.exportList(list, "output.xml");
}
通常我的测试包含断言,如assertEquals(...)。所以我将代码更改为以下
public void exportCustomerListTest() throws Exception {
// delete the old resulting file, so we can test for a new one at the end
File file = new File("output.xml");
file.delete();
//...creating a list with some objects to export...
JAXBService service = new JAXBService();
service.exportCustomers(list, "output.xml");
// Test if a file has been created and if it contains some bytes
FileReader fis = new FileReader("output.xml");
int firstByte = fis.read();
assertTrue(firstByte != -1 );
}
我是否需要这个,或者第一种方法是否足够?我问的是,第一种实际上只是“测试”代码运行,但没有测试任何结果。或者我可以依赖“合同”,如果导出方法在没有例外的情况下运行,测试通过了吗?
由于
答案 0 :(得分:4)
嗯,您正在测试您的代码是否运行完成而没有任何例外 - 但您没有测试任何有关输出的内容。
为什么不保留具有预期输出的文件,并将其与实际输出进行比较?请注意,如果您的expertCustomers
重载超过Writer
,则可能会更容易 - 然后您可以传入StringWriter
并仅写入内存。您可以通过多种方式对其进行测试,只需对带有文件名的重载进行一次测试,因为这样可以创建FileOutputStream
包裹在OutputStreamWriter
中,然后调用更彻底测试的方法。您可能只需要检查是否存在正确的文件。
答案 1 :(得分:1)
你可以使用
assertTrue(new File("output.xml")).exist());
如果您在生成文件期间发现问题,您可以对生成过程进行单元测试(而不是文件正确编写并从文件系统重新加载的事实)
您可以使用“黄金文件”方法(测试两个文件是1对1相同)还是测试生成器的各种输出(我想将内容的生成与保存分离到文件中)
答案 2 :(得分:1)
我同意其他帖子。我还要补充一点,你的第一个测试不会告诉测试套件或测试运行器这个特定测试是否失败。
答案 3 :(得分:0)
有时,测试只需要证明没有抛出任何异常。在那种情况下,依赖于异常将失败,测试就足够了。通过调用assertEquals方法肯定没有在JUnit中获得任何东西。测试在不抛出AssertionException时传递,而不是因为调用了该方法。考虑一个允许空输入的方法,您可以编写如下测试:
@Test public void testNullAllowed() {
new CustomObject().methodThatAllowsNull(null);
}
那可能就足够了一个测试(留下一个单独的测试,或者也许没有什么有趣的东西来测试它用null值做什么),尽管谨慎地留下你不会忘记的评论断言,你是故意把它留下来的。
但是,在您的情况下,您没有进行过多次测试。当然它没有爆炸,但空方法也不会爆炸。你的第二个测试更好,至少你证明创建了一个非空文件。但是你可以做得更好,并检查是否至少创建了一些合理的结果。