Как имитировать вход сканера из другого класса (тестовый класс), не мешая этому фактическому классу - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу протестировать метод сообщения из другого класса, тестового класса, но независимым образом, чтобы тестовый класс вызывал метод сообщения и вводил предварительно определенное значение для количества строк и фактического сообщения.Поэтому, когда метод вызывается, значение 1 вводится в консоли при запросе номера строки, а затем после запроса сообщения вводится строка «привет, как дела» сегодня в консоли.Ниже у меня есть метод сообщения из одного класса и часть тестового класса, которая будет проверять пользовательский ввод.

Итак, мой вопрос: как я могу заставить тестовый класс вызывать метод сообщения (который находится в другом классе) и когда этот метод сообщения запускается, вводить значения в сканер по мере необходимости, а затем это сообщениеМетод продолжает работать до конца.

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

Нажмите здесь, чтобы увидеть консоль дляМетод сообщения

public static String message() {
    //Asks the user for the number of lines in the message
    Scanner lines = new Scanner(System.in);
    System.out.print("Enter how number of lines in the message: ");   

    //if user doesn't enter a number, it keeps asking for one
    while(!lines.hasNextInt()) {
        System.out.print("Error! Please Choose a Number:");
        lines.next();
    }

    //the number of lines is stores in an array where each index is a line
    String[] input = new String[lines.nextInt()];
    System.out.println("Enter the message: ");
    lines.nextLine(); //consuming the <enter> from input above

    //each index is given a line to store
    for (int i = 0; i < input.length; i++) {
        input[i] = lines.nextLine();
    }
    //message if turned into a one line string and returned
    String message = (Arrays.toString(input).replaceAll("\\W", "")).toLowerCase();
    return message;
}

String keyTest5 = "1";String keyTest6 = "adbh, sdba";

    SarmanEncryption inputOutput= new SarmanEncryption();
    inputOutput.message();
    InputStream num = new ByteArrayInputStream(keyTest5.getBytes());
    System.setIn(Integer.parseInt(num));
    InputStream message = new ByteArrayInputStream(keyTest6.getBytes());
    System.setIn(message);

1 Ответ

0 голосов
/ 13 февраля 2019

Подумайте о переписывании кода, чтобы его можно было легко тестировать.Если вы тестируете метод сообщения, вы можете передать потоки ввода / вывода этому методу.

Вы также можете сделать это (внедрить зависимость от потоков ввода / вывода) в конструкторе вашего объекта, который имеет метод вtest.

Будьте осторожны при закрытии потоков.

...