如何在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正确地做这个(准备测试,并测试自己)?

在代码或文本文件中创建一些虚拟数据。

在第一种情况下,写出文件并将其读回,因为它是相同的。

在第二种情况下,您可以读取文本文件并再次将其写出,并检查它是否相同。