简体   繁体   English

测试从标准输入读取并写入标准输出的 Java 程序

[英]Test java programs that read from stdin and write to stdout

I am writing some code for a programming contest in java.我正在为 Java 编程竞赛编写一些代码。 The input to the program is given using stdin and output is on stdout.程序的输入使用 stdin 给出,输出在 stdout 上。 How are you folks testing programs that work on stdin/stdout?你们如何测试在标准输入/标准输出上工作的程序? This is what I am thinking:这就是我的想法:

Since System.in is of type InputStream and System.out is of type PrintStream, I wrote my code in a func with this prototype:由于 System.in 是 InputStream 类型,System.out 是 PrintStream 类型,我用这个原型在 func 中编写了我的代码:

void printAverage(InputStream in, PrintStream out)

Now, I would like to test this using junit.现在,我想使用 junit 测试它。 I would like to fake the System.in using a String and receive the output in a String.我想使用字符串伪造 System.in 并接收字符串中的输出。

@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());
}

What is the 'correct' way to implement getInputStreamFromString() and getPrintStreamForString()?实现 getInputStreamFromString() 和 getPrintStreamForString() 的“正确”方法是什么?

Am I making this more complicated than it needs to be?我是否使这比需要的更复杂?

Try the following:请尝试以下操作:

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

stringStream is a stream that will read chars from the input string. stringStream是一个将从输入字符串中读取字符的流。

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

printStream is a PrintStream that will write to the outputStream which in turn will be able to return a string. printStream是一个PrintStream ,它将写入outputStream ,后者又将能够返回一个字符串。

EDITED: Sorry I misread your question.编辑:对不起,我误读了你的问题。

Read with scanner or bufferedreader, The latter is much faster than the former.用scanner或bufferedreader读取,后者比前者快很多。

Scanner jin = new Scanner(System.in);

BufferedReader reader = new BufferedReader(System.in);

Write to stdout with print writer.使用打印写入器写入标准输出。 You can also print directly to Syso but this is slower.您也可以直接打印到 Syso,但速度较慢。

System.out.println("Sample");
System.out.printf("%.2f",5.123);

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

I am writing some code for a programming contest in java.我正在为 Java 编程竞赛编写一些代码。 The input to the program is given using stdin and output is on stdout.程序的输入使用 stdin 给出,输出在 stdout 上。 How are you folks testing programs that work on stdin/stdout?你们如何测试在标准输入/标准输出上工作的程序?

Another way to send characters to System.in is to use PipedInputStream and PipedOutputStream .另一种将字符发送到System.in是使用PipedInputStreamPipedOutputStream Maybe something like the following:也许类似于以下内容:

PipedInputStream pipeIn = new PipedInputStream(1024);
System.setIn(pipeIn);

PipedOutputStream pipeOut = new PipedOutputStream(pipeIn);

// then I can write to the pipe
pipeOut.write(new byte[] { ... });

// if I need a writer I do:
Writer writer = OutputStreamWriter(pipeOut);
writer.write("some string");

// call code that reads from System.in
processInput();

On the flip side, as mentioned by @Mihai Toader, if I need to test System.out then I do something like:另一方面,正如@Mihai Toader 所提到的,如果我需要测试System.out那么我会执行以下操作:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
System.setOut(new PrintStream(baos));

// call code that prints to System.out
printSomeOutput();

// now interrogate the byte[] inside of baos
byte[] outputBytes = baos.toByteArray();
// if I need it as a string I do
String outputStr = baos.toString();

Assert.assertTrue(outputStr.contains("some important output"));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM