Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取System.out Java测试_Java - Fatal编程技术网

读取System.out Java测试

读取System.out Java测试,java,Java,我的任务是测试控制台应用程序。我可以访问一个方法,但还想检查字符串格式是否正常工作 由于此方法不返回字符串,而是打印到控制台,是否有办法截取列表打印行 测试这类事情有意义吗?您可以使用System.setOut()重定向System.out.println写入PrintStream(OutputStream)。然后,您可以将输出流写入一个字符串并对其进行测试。测试该流的方法是使用“输出”抽象而不是直接打印到“system.out”中,这是一个很好的设计。例如: interface Output

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

由于此方法不返回字符串,而是打印到控制台,是否有办法截取列表打印行


测试这类事情有意义吗?

您可以使用
System.setOut()
重定向
System.out.println
写入
PrintStream(OutputStream)
。然后,您可以将输出流写入一个字符串并对其进行测试。

测试该流的方法是使用“输出”抽象而不是直接打印到“system.out”中,这是一个很好的设计。例如:

 interface Output {
    void print(String data);
 }
public void test_my_program() {

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

    myProgram.doSomething();

    verity(mockOutput).print("do something!");
}
然后将此依赖项注入需要向输出发送信息的类:

class MyProgram {

  private Output out;

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

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

然后,您可以轻松地使用mock进行测试(例如,使用mockito):

我不验证代码,但它或多或少是正确的,我希望您能够理解。总是一样的,测试并不困难,困难的是设计好的可测试代码,这里我们只使用抽象和依赖注入,这是面向对象的两个基本原则


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

下面是一个如何捕获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());

请看:您是否可以选择修改正在测试的代码,还是必须按原样进行测试?否。不幸的是,这是不允许的。我正在测试它正在调用的一个方法,但我也想测试发送到控制台的输出。我相信@KevinWorkman基本上回答了您的问题。您可以将System.out设置为自己的打印流。(不确定,但你可能需要自己写。)