2015-10-20 3 views
0

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

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

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

Пример симуляции System.in для сканера был бы очень признателен.

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, так как это рекурсивный метод, пока определенный параметр не задан, чтобы завершить программу.

+0

* «Вот попытка, которая приводит к исключению nullPointerException для сканера - поскольку нет обнаруженного входа» * Stacktrace? – Tom

+0

* «Он останавливается при TEMP-2, поскольку это рекурсивный метод, пока не будет предоставлена ​​определенная опция для завершения программы». * Итак, почему бы вам не указать, что определенная опция в качестве входных данных вместо использования пустой строки? – Tom

+0

Почему бы не использовать новый сканер (новый файл («simulatedUserInput.txt»)), а не пытаться издеваться над 'System.in'? –

ответ

0

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

System.setIn(new ByteArrayInputStream("data".getBytes())); 
+0

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

+0

Вы также можете имитировать несколько строк ввода. Вместо «данных» строка становится, скажем, «(« line1 »+ System.lineSeparator() +« line2 »)' – ThatOneCloud

0

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

scanner.read(2); 

Однако Сканер предназначен для чтения из 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(); 
+0

Я могу попробовать сканирование из файла только для того, чтобы его каким-то образом протестировать без моего взаимодействия, но это может быть ответ на мой тест; Я вернусь –

+0

Извините за огромную задержку, я был в отъезде; Я сортировал его, используя txt-файл в качестве входных данных, и я использовал scannerNextLine() всякий раз, когда мне это нужно. Спасибо за ваше время. Я не могу дать вам толстый, поскольку у меня недостаточно репутации. –