Реальная проблема здесь:
public class UserInputHandler {
public static final Scanner SCANNER = new Scanner(System.in);
}
Вы заставляете этот входной сигнал поступить с System.in
.Почему бы не использовать
public class UserInputHandler {
public Scanner getScanner() {
return new Scanner(someInputStream);
Конечно, теперь вам нужно беспокоиться о том, откуда исходит someInputStream
, но вы позволили себе быть гораздо более гибким.
Ваш код на самом деле не находится на одном статическом объекте, вместо этого он делает вызов и получает, что читает из где-то .А затем в своих тестах вы просто определяете входные потоки и убедитесь, что эти входные потоки можно использовать (например, сделав это поле класса UserInputHandler, которое устанавливается при создании экземпляра этого класса.
Другими словами: реальное решение состоит в том, чтобы изменить ваш производственный код, чтобы сделать его A) более гибким и B) простым для тестирования.Вы получили это задом наперед: вы написали негибкий и сложный для тестирования код, а теперь вы пытаетесь согнуть свои тестовые примеры, чтобы они были разумными.
Неправильный подход: когда вы не можете написать простые, простые тесты, тогда ваш рабочий код должен быть переработан.Всегда.