Как я могу тестировать классы, которые читают ввод в Java? - PullRequest
2 голосов
/ 12 ноября 2011

Как можно запустить тесты для класса, который читает из System.in для ввода пользователя?

Например:

private int getUserInput() {
    Scanner scanner = new Scanner(System.in);

    System.out.print("What's ya input? [1-3]: ");
    return scanner.nextInt();
}

Я подумал, может быть, подкласс основного класса и переопределить getUserInput для обратной связи по сценарию. Хотя это не сработает, если вам нужно прочитать System.out, чтобы определить входные данные.

Я потратил несколько часов на поиск Тем, но также не мог понять, как их использовать.

Ответы [ 3 ]

13 голосов
/ 12 ноября 2011

Ну, вы можете заменить System.in, используя System.setIn(), но я бы не одобрил такой подход.Установка глобального состояния всегда делает ваши тесты немного более хрупкими и непрозрачными.

Вместо этого вы действительно должны попытаться разорвать зависимость, например, введя InputStream, который вы хотите прочитать, в свой класс черезконструктор класса.Как только вы это сделаете, при модульном тестировании вы можете передать свой собственный InputStream, который читает из статических данных, и в свой рабочий код вы можете ввести System.in.

2 голосов
/ 12 ноября 2011

Вы можете создать Макет объектов, которые имитируют пользовательский ввод.

2 голосов
/ 12 ноября 2011

Либо поместите ваши ссылки на System.in и System.out в переменные, либо на значения методов, которые вы можете переопределить в своем тесте (другими потоками, такими как ByteArrayInput / OutputStream, или (если это невозможно) использовать System .setOut и System.setIn, чтобы заменить потоки по умолчанию, запустить тест, проверить вывод и вернуть их обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...