关于junit:测试从stdin读取并写入stdout的java程序

Test java programs that read from stdin and write to stdout

我正在编写一些Java编程竞赛的代码。程序的输入使用stdin给出,输出在stdout上。你们如何测试在stdin/stdout上工作的程序?我就是这么想的:

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

1
void printAverage(InputStream in, PrintStream out)

现在,我想用JUnit测试这个。我想用一个字符串来伪造system.in并接收一个字符串中的输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
@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());
}

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

我是不是让事情变得更复杂了?


请尝试以下操作:

1
2
String string ="aaa";
InputStream stringStream = new java.io.ByteArrayInputStream(string.getBytes())

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

1
2
3
4
OutputStream outputStream = new java.io.ByteArrayOutputStream();
PrintStream printStream = new PrintStream(outputStream);
// .. writes to printWriter and flush() at the end.
String result = outputStream.toString()

printStream是一个printStream,它将写入outputStream,从而可以返回字符串。


编辑:对不起,我误解了你的问题。

用扫描器或缓冲阅读器阅读,后者比前者快得多。

1
2
3
Scanner jin = new Scanner(System.in);

BufferedReader reader = new BufferedReader(System.in);

使用打印书写器写入stdout。您也可以直接打印到Syso,但速度较慢。

1
2
3
4
5
6
System.out.println("Sample");
System.out.printf("%.2f",5.123);

PrintWriter out = new PrintWriter(System.out);
out.print("Sample");
out.close();