Probar programas java que leen desde stdin y escribir en stdout

Estoy escribiendo un código para un concurso de programación en java. La entrada al programa se da usando stdin y la salida está en stdout. ¿Cómo estáis probando los programas que funcionan en stdin / stdout? Esto es lo que estoy pensando:

Como System.in es de tipo InputStream y System.out es de tipo PrintStream, escribí mi código en una función con este prototipo:

void printAverage(InputStream in, PrintStream out)

Ahora, me gustaría probar esto usando junit. Me gustaría falsificar el System.in usando una cadena y recibir la salida en una cadena.

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

¿Cuál es la forma 'correcta' de implementar getInputStreamFromString () y getPrintStreamForString ()?

¿Estoy haciendo esto más complicado de lo que necesita ser?

Respuestas a la pregunta(2)

Su respuesta a la pregunta