读取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设置为自己的打印流。(不确定,但你可能需要自己写。)