2012-11-11 14 views
7

Piszę kod do konkursu programistycznego w języku Java. Dane wejściowe do programu podane są za pomocą stdin, a wyjście na standardowe wyjście. W jaki sposób testujesz programy działające na stdin/stdout? To, co mam na myśli:Testuj programy java, które czytają ze stdin i napisz na stdout

Od System.in jest typu InputStream i System.out jest typu PrintStream pisałem mój kod w func z tego prototypu:

void printAverage(InputStream in, PrintStream out) 

Teraz będę lubię to testować za pomocą junit. Chciałbym sfałszować System.in za pomocą ciągu i otrzymać dane wyjściowe w łańcuchu.

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

Co to jest 'poprawny' sposób wdrożyć getInputStreamFromString() i getPrintStreamForString()?

Czy to sprawia, że ​​jest to bardziej skomplikowane, niż powinno być?

+1

Może http://stackoverflow.com/questions/782178/how-do-i-convert-a-string-to-an-inputstream-in-java i http://stackoverflow.com/questions/216894/ get-an-outputstream-into-a-string może pomóc ... – tcovo

+0

możliwy duplikat [testu JUnit z symulowanym wpisem użytkownika] (http://stackoverflow.com/questions/6415728/junit-testing-with-simulated-user -input) –

Odpowiedz

6

Spróbuj wykonać następujące czynności:

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

stringStream jest strumień, który będzie czytać chard z ciągu wejściowego.

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

printStream jest PrintStream że napisze do outputStream który z kolei będzie mógł powrócić ciąg.

+0

Czy chodzi ci o PrintStream zamiast PrintWriter? – user674669

+0

Tak. błędnie odczytałem pytanie na początku jako wymagające PrintWriter –

0

EDYTOR: Przepraszam, błędnie przeczytałem twoje pytanie.

Odczyt za pomocą skanera lub bufora, ten ostatni jest znacznie szybszy niż poprzedni.

Scanner jin = new Scanner(System.in); 

BufferedReader reader = new BufferedReader(System.in); 

Napisz na stdout z programem piszącym. Możesz także drukować bezpośrednio na Syso, ale jest to wolniej.

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

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

Nie można przekazać 'System.in' do BufferedReader. Najpierw należy zawinąć go w 'InputStreamReader'. – byxor

Powiązane problemy