Eine übliche Methode zum Testen eines ähnlichen Codes besteht darin, eine Methode zu extrahieren, die einen Scanner und einen PrintWriter enthält, ähnlich wie bei dieser StackOverflow-Antwort , und Folgendes zu testen:
public void processUserInput() {
processUserInput(new Scanner(System.in), System.out);
}
public void processUserInput(Scanner scanner, PrintWriter output) {
output.println("Give a number between 1 and 10");
int input = scanner.nextInt();
while (input < 1 || input > 10) {
output.println("Wrong number, try again.");
input = scanner.nextInt();
}
return input;
}
Beachten Sie, dass Sie Ihre Ausgabe erst am Ende lesen können und alle Ihre Eingaben im Voraus angeben müssen:
@Test
public void shouldProcessUserInput() {
StringWriter output = new StringWriter();
String input = "11\n"
+ "10\n";
assertEquals(10, systemUnderTest.processUserInput(
new Scanner(input), new PrintWriter(output)));
assertThat(output.toString(), contains("Wrong number, try again.")););
}
Anstatt eine Überladungsmethode zu erstellen, können Sie natürlich auch "Scanner" und "Ausgabe" als veränderbare Felder in Ihrem zu testenden System beibehalten. Ich mag es, den Unterricht so staatenlos wie möglich zu halten, aber das ist kein großes Zugeständnis, wenn es Ihnen oder Ihren Mitarbeitern / Ausbildern wichtig ist.
Sie können Ihren Testcode auch in dasselbe Java-Paket wie den zu testenden Code einfügen (auch wenn er sich in einem anderen Quellordner befindet), wodurch Sie die Sichtbarkeit der Überladung mit zwei Parametern lockern können, um paketprivat zu sein.