Одним із поширених способів тестування подібного коду є вилучення методу, який бере сканер та PrintWriter, подібний до цієї відповіді StackOverflow , та тестування, яке:
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;
}
Зверніть увагу, що ви не зможете прочитати свої результати до кінця, і вам доведеться вказувати всі введені дані заздалегідь:
@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.")););
}
Звичайно, замість того, щоб створювати метод перевантаження, ви також можете зберегти "сканер" та "вихід" як змінні поля у вашій системі під тестом. Мені, як правило, подобається проводити заняття якнайменше без громадянства, але це не дуже велика поступка, якщо це важливо для вас або ваших колег / викладачів.
Ви також можете помістити свій тестовий код в той самий пакет Java, що і тестований код (навіть якщо він знаходиться в іншій вихідній папці), що дозволяє зменшити видимість перевантаження двох параметрів, щоб бути приватним для пакета.