阅读 System.out Java 测试

4

我有一个测试控制台应用程序的任务。我可以访问其中一个方法,但也想检查字符串格式化是否正常工作。

由于该方法不返回字符串,而是打印到控制台,有没有办法拦截打印的内容?

对这种东西进行测试甚至有意义吗?


2
请查看此链接:https://dev59.com/r3A75IYBdhLWcg3wkJ31 - Kevin Workman
你有修改正在测试的代码的选项吗?还是必须按原样进行测试? - James Dunn
不好意思,它超出了范围。我正在测试一个方法的调用,但也想测试输出是否被传递到控制台。 - james_dean
我相信@KevinWorkman基本上已经回答了你的问题。你可以将System.out设置为自己的PrintStream。(不确定,但你可能需要编写自己的PrintStream。) - Radiodef
3个回答

19

这是一个示例,说明如何捕获System.out的输出:

java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream();    
System.setOut(new java.io.PrintStream(out));    

System.out.println("Test output");    
System.err.println("Out was: " + out.toString());

2

您可以使用System.setOut()来重定向System.out.println写入到一个PrintStream(OutputStream)中。然后,您可以将该OutputStream写入字符串并进行测试。


0

测试的方法是使用“输出”抽象而不是直接打印到“system.out”来进行良好的设计。例如:

 interface Output {
    void print(String data);
 }

然后你将这个依赖注入到需要向输出发送信息的类中:

class MyProgram {

  private Output out;

  public MyProgram(Output output) {
     this.out = output;
  }

  public doSomething() {
     // do something
     out.print("i do something!);
  }

}

然后你可以使用模拟对象(例如使用Mockito)轻松进行测试:

public void test_my_program() {

    Output mockOutput = mock(Output.class);
    MyProgram myProgram = new MyProgram(mockOutput);

    myProgram.doSomething();

    verity(mockOutput).print("do something!");
}

我没有验证代码,但它大致正确,我希望足够让你理解。总是如此,测试并不困难,困难的是设计良好可测试的代码,在这里我们只使用抽象和依赖注入两个面向对象的基本原则。

这段代码的真正优势在于现在它不再与“System.out”绑定,例如,您可以在Web应用程序中使用此类,如果您愿意,例如制作一个输出实现,通过websocket与Web客户端通信。这是另一个面向对象的原则,您的类现在是“开放-关闭”的,您可以添加功能(websocket疯狂的例子:P)而不修改您的实际代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接