2012-11-11 13 views
7

私はjavaでプログラミングコンテストのコードを書いています。プログラムへの入力はstdinで与えられ、出力はstdoutで出力されます。 stdin/stdoutで動作するプログラムをどうやってテストしていますか? System.inはInputStream型のものであり、のSystem.outはPrintStream型であるため、私はこのプロトタイプでFUNCに自分のコードを書いた stdinから読み込んでstdoutに書き込むjavaプログラムをテストしてください

:今

void printAverage(InputStream in, PrintStream out) 

、私はだろうこれは私が考えているものです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()); 
} 

getInputStreamFromString()とgetPrintStreamForString()を実装する正しい方法は何ですか?

これはもっと複雑にする必要がありますか?

+1

おそらくhttp://stackoverflow.com/questions/782178/how-do-i-convert-a-string-to-an-inputstream-in-javaとhttp://stackoverflow.com/questions/216894/出力ストリームを取得することができます。 – tcovo

+0

[JUnitテストとシミュレートされたユーザ入力]の複製が可能です。(http://stackoverflow.com/questions/6415728/junit-testing-with-simulated-user -input) –

答えて

6

次のことを試してみてください。

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

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順番に文字列を返すことができるようになりますoutputStreamに書き込みますPrintStreamです。

+0

PrintWriterではなくPrintStreamを意味しましたか? – user674669

+0

はい。私は最初にPrintWriterが必要であると誤解しました –

0

EDITED:ご迷惑をおかけして申し訳ありません。

スキャナまたはbufferedreaderで読み取ると、後者は前者よりもはるかに高速です。

Scanner jin = new Scanner(System.in); 

BufferedReader reader = new BufferedReader(System.in); 

プリントライターで標準出力に書き込みます。また、Sysoに直接印刷することもできますが、これは遅いです。

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

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

'System.in'をBufferedReaderに渡すことはできません。最初に 'InputStreamReader'でそれをラップする必要があります。 – byxor

関連する問題