Как имитировать пользовательский ввод для сканера?

У меня есть класс, в котором пользователь взаимодействует с окном терминала и вводит определенные параметры, на основе этих параметров он переключается и использует определенные методы; Мне нужно использовать сканер для обнаружения пользовательского ввода.

Несколько дней я пытался создать тестовый класс для имитации пользовательского ввода, но я не могу найти правильный способ сделать это, так как я не могу имитировать System.in для сканера, и я не нашел никакой конкретной информации, я видел что-то о буферизация, но я не могу ее использовать.

Вот попытка, которая приводит к исключению nullPointerException для сканера, потому что ввод не обнаружен. Я также пытался заснуть, а затем установить ввод.

Пример моделирования System.in для Scanner был бы очень признателен.

public void test1addItem()
{
    InputStream input = new ByteArrayInputStream("".getBytes());
    String data1="1"; //Add an item option
    String data2="bread"; //The item to add

    input = new ByteArrayInputStream(data1.getBytes());
    //System.out.println("DATA1="+input);
    System.out.println("TEMP - 1");
    System.setIn(input);
    System.out.println("TEMP - 2");
    tsl.start(); //reference to the class which I am testing
    System.out.println("TEMP - 3");
    try {
        Thread.sleep(2000);
    } catch(InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
    System.out.println("TEMP - 4");
    input = new ByteArrayInputStream(data2.getBytes());
    System.out.println("TEMP - 5");
    System.setIn(input);
    System.out.println("TEMP - 6");
}

Он останавливается на TEMP - 2, так как это рекурсивный метод до тех пор, пока не будет задана определенная опция для завершения программы.


person 4673_j    schedule 20.10.2015    source источник
comment
Вот попытка, которая приводит к исключению nullPointerException для сканера, потому что входные данные не обнаружены Stacktrace?   -  person Tom    schedule 20.10.2015
comment
Он останавливается на TEMP - 2, так как это рекурсивный метод до тех пор, пока не будет задана определенная опция для завершения программы. Так почему бы вам не указать эту конкретную опцию в качестве входных данных вместо использования пустой строки? ?   -  person Tom    schedule 20.10.2015
comment
Почему бы не использовать new Scanner(new File("simulatedUserInput.txt")) вместо того, чтобы пытаться издеваться над System.in?   -  person Luiggi Mendoza    schedule 20.10.2015
comment
В наши дни все используют класс Scanner и путаются, а как насчет чтения InputStream из System.in?   -  person Stefan    schedule 20.10.2015
comment
Я не могу получить доступ к сканеру, поэтому я не могу изменить его ввод   -  person 4673_j    schedule 20.10.2015
comment
Уже прочитал документацию оракула, но не могу найти способ имитировать пользовательский ввод.   -  person 4673_j    schedule 20.10.2015


Ответы (2)


Вы пробовали переназначить System.in?

System.setIn(new ByteArrayInputStream("data".getBytes()));
person ThatOneCloud    schedule 20.10.2015
comment
Я так и сделал, и этот метод продвинул меня на один шаг вперед, но при второй попытке он выдает ошибку, так как для некоторых методов он переводит пользователя в другое меню, где ему нужно ввести некоторые данные, и там он терпит неудачу. - person 4673_j; 20.10.2015
comment
Вы также можете имитировать несколько строк ввода. Вместо данных строка становится, скажем, ("line1" + System.lineSeparator() + "line2") - person ThatOneCloud; 20.10.2015

Фундаментальное обоснование этой идеи ошибочно. Я предполагаю, что вы хотите сделать что-то вроде

scanner.read(2);

Однако Scanner предназначен для чтения из InputStreams, таких как стандартный ввод и файлы. Ему нужен источник для чтения, а константа, такая как 2, является просто недопустимым источником.

Проблема также возникает, если вы используете метод, который должен подавать 2 в качестве входных данных при вызове readLine(). Сканеры начинают чтение только тогда, когда вы вызываете метод чтения, и они не останавливаются, пока не закончат чтение. Итак, если бы вы должны были сделать

String s = scanner.readLine();
scanner.feed("hi");

код никогда не достигнет второй строки. Если бы ты сделал

scanner.feed("hi");
String s = scanner.readLine();

сканер никогда не увидит «привет», потому что он был подан до чтения сканером.

Возможно, вы сможете настроить какой-то поток, который просто выводит постоянные «привет», но гораздо практичнее просто имитировать ввод самостоятельно из System.in или файла.

Вы также можете просто установить переменную на то, что было бы введено! Например:

String s = "hi";   //scanner.readLine();
person Eyob Tsegaye    schedule 20.10.2015
comment
Я мог бы попробовать просканировать файл только для того, чтобы протестировать его как-то без моего участия, но это может быть ответом на мой тест; Я вернусь - person 4673_j; 20.10.2015
comment
Извините за огромную задержку, меня не было; Я разобрался с этим, используя текстовый файл в качестве входных данных, и я использовал scanNextLine() всякий раз, когда мне это нужно. Спасибо за уделенное время. Я не могу дать вам толстую, так как у меня недостаточно репутации.. - person 4673_j; 03.11.2015