测试从stdin读取并写入stdout的java程序

use*_*669 9 java junit mocking

我正在为java编程竞赛编写一些代码.程序的输入是使用stdin给出的,输出是在stdout上.你们如何测试在stdin/stdout上运行的程序?这就是我的想法:

由于System.in的类型为InputStream,而System.out的类型为PrintStream,因此我使用此原型在func中编写了我的代码:

void printAverage(InputStream in, PrintStream out)
Run Code Online (Sandbox Code Playgroud)

现在,我想用junit来测试它.我想使用String伪造System.in并在String中接收输出.

@Test
void testPrintAverage() {

    String input="10 20 30";
    String expectedOutput="20";

    InputStream in = getInputStreamFromString(input);
    PrintStream out = getPrintStreamForString();

    printAverage(in, out);

    assertEquals(expectedOutput, out.toString());
}
Run Code Online (Sandbox Code Playgroud)

实现getInputStreamFromString()和getPrintStreamForString()的"正确"方法是什么?

我这让它变得比它需要的更复杂吗?

Mih*_*der 7

请尝试以下方法:

String string = "aaa";
InputStream stringStream = new java.io.ByteArrayInputStream(string.getBytes())
Run Code Online (Sandbox Code Playgroud)

stringStream 是一个将从输入字符串中读取chard的流.

OutputStream outputStream = new java.io.ByteArrayOutputStream();
PrintStream printStream = new PrintStream(outputStream);
// .. writes to printWriter and flush() at the end.
String result = outputStream.toString()
Run Code Online (Sandbox Code Playgroud)

printStream是一个PrintStream将写入outputStream,然后将能够返回一个字符串.