Przetestuj programy Java, które czytają ze standardowego wejścia i zapisują na standardowe wyjście

Piszę kod do konkursu programistycznego w Javie. Dane wejściowe do programu są podawane za pomocą stdin, a wyjście jest na stdout. Jak testujesz programy działające na stdin / stdout? Oto, o czym myślę:

Ponieważ System.in jest typu InputStream i System.out jest typu PrintStream, napisałem mój kod w func z tym prototypem:

void printAverage(InputStream in, PrintStream out)

Teraz chciałbym to przetestować za pomocą junit. Chciałbym sfałszować System.in używając String i otrzymać wyjście w 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());
}

Jaki jest „poprawny” sposób implementacji getInputStreamFromString () i getPrintStreamForString ()?

Czy robię to bardziej skomplikowane niż musi być?

questionAnswers(2)

yourAnswerToTheQuestion