2012-11-11 16 views
7

Sto scrivendo del codice per un concorso di programmazione in java. L'input per il programma è dato usando stdin e l'output è su stdout. Come state testando programmi che funzionano su stdin/stdout? Questo è quello che penso:Test dei programmi java che leggono dallo stdin e scrivono sullo stdout

Dal System.in è di tipo InputStream e System.out è di tipo PrintStream, ho scritto il mio codice in un func con questo prototipo:

void printAverage(InputStream in, PrintStream out) 

Ora, vorrei piace testare questo utilizzando junit. Mi piacerebbe simulare System.in usando una stringa e ricevere l'output in una stringa.

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

Qual è il modo 'corretto' per implementare getInputStreamFromString() e getPrintStreamForString()?

Sto rendendo questo più complicato di quanto deve essere?

+1

Forse http://stackoverflow.com/questions/782178/how-do-i-convert-a-string-to-an-inputstream-in-java e http://stackoverflow.com/questions/216894/ get-an-outputstream-in-a-string può aiutare ... – tcovo

+0

possibile duplicato di [test JUnit con input utente simulato] (http://stackoverflow.com/questions/6415728/junit-testing-with-simulated-user -input) –

risposta

6

provare quanto segue:

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

stringStream è un flusso che leggerà bietole dalla stringa di input.

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

printStream è un PrintStream che scriveranno al outputStream che a sua volta in grado di restituire una stringa.

+0

Intendevi PrintStream invece di PrintWriter? – user674669

+0

Sì. Ho erroneamente letto la domanda all'inizio come se avessi bisogno di un PrintWriter –

0

MODIFICATO: Spiacente ho letto male la tua domanda.

Lettura con scanner o lettore buffer, quest'ultimo è molto più veloce del precedente.

Scanner jin = new Scanner(System.in); 

BufferedReader reader = new BufferedReader(System.in); 

Scrittura su stdout con scrittore di stampa. Puoi anche stampare direttamente su Syso, ma questo è più lento.

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

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

Non è possibile passare 'System.in' in BufferedReader. Devi prima metterlo in un 'InputStreamReader'. – byxor