如何在Java中测试写入文件?
我是初学者,掌握在手中。 我有一些简单的程序,我需要对write方法进行junit测试。 我在输入中有一些collections。 我怎么能这样做? 这是我的代码:
// write to file public void write(String fileName, List figuresList) { try { PrintWriter out = new PrintWriter( new File(fileName).getAbsoluteFile()); try { for (int i = 0; i < figuresList.size(); i++) { out.println(figuresList.get(i).toString()); } } finally { out.close(); } } catch (IOException e) { System.out.println("Cannot write to file!"); } }
我想知道,因为我从文件中读取后,我们可以加入两个测试(写/读)或者更好地单独执行(如果我们的测试失败,我们不知道哪里有问题 – 读或写)? 如何在junit正确地做这个(准备测试,并测试自己)? 更好地展示示例,这种方式更好地理解。
谢谢你,纳扎尔。
我建议您在IO类(在您的情况下为PrintWriter
类)中创建一个接口包装器,以便您可以使用模拟对象进行输出。 您不必测试Java PrintWriter
,您想测试您的function,对吧?
所以你的课程将是
class MyClass { MyWriter out; public void setOut(MyWriter out) { this.out = out; } // write to file public void write(String fileName, List figuresList) { try { try { for (int i = 0; i < figuresList.size(); i++) { out.println(figuresList.get(i).toString()); } } finally { out.close(); } } catch (IOException e) { System.out.println("Cannot write to file!"); } } }
MyWriter
界面的签名非常简单。
interface MyWriter { void println(Object x); // You can add other println methods here. void close(); }
然后您可以使用EasyMock编写测试。 测试方法就像是
@Test public void testWrite() { MyWriter out = EasyMock.createMock(MyWriter.class); EasyMock.expect(mock.println(EasyMock.anyObject())).times(3); EasyMock.expect(mock.close()).times(1); List list = ... list.add(...); list.add(...); list.add(...); replay(mock); MyClass myClass = new MyClass(); myClass.setOut(out); myClass.write("mockFileName", list); verify(mock); }
你可能根本不需要嘲笑。 尝试在测试中使用StringWriter。
// write to file public void write(String fileName, List figuresList) { try { Writer out = new FileWriter(new File(fileName).getAbsoluteFile()); write(out, figuresList); } catch (IOException e) { System.out.println("Cannot write to file!"); } } @VisibleForTesting void write(Writer writer, List figuresList) { PrintWriter out = new PrintWriter(writer); try { for (int i = 0; i < figuresList.size(); i++) { out.println(figuresList.get(i).toString()); } } finally { out.close(); } } @Test public void testWrite() { List list = Lists.newArrayList(); list.add(...); // A list.add(...); // B list.add(...); // C StringWriter stringWriter = new StringWriter(); write(stringWriter, list); assertEquals("A.\nB.\nC.\n", stringWriter.toString()); }
你似乎有正确的想法所以我不确定你需要什么帮助…
我们可以加入两个测试(写/读)
是。
或者更好地单独做这件事(因为如果我们的测试结果我们不知道问题在哪里 – 读或写)?
更好但更难维护。
如何在junit正确地做这个(准备测试,并测试自己)?
在代码或文本文件中创建一些虚拟数据。
在第一种情况下,写出文件并将其读回,因为它是相同的。
在第二种情况下,您可以读取文本文件并再次将其写出,并检查它是否相同。