2016-01-03 5 views
1

Каким образом можно протестировать следующий метод?Модульное тестирование метода ввода в консоль Java

public static String grabString() { 
BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); 
do { 
    try { 
    // call the readline method of the buffered reader object. 
    return r.readLine(); 
    } catch (Exception e) { 
    } 
} while (true);} 

Если я называю этот метод из тестового класса как так

String getInput = grabString(); 

И проверить его с

assertEquals(getInput, "hello"); 

Можно ли использовать код, чтобы ввести «привет» в консоли без необходимости вводить текст так, чтобы единичный тест мог запускаться мгновенно?

+1

Вы можете проверить код, который встроен в JDK, но можно предположить, что уже работает. Неясно, что ваша петля пытается достичь, и как вы запускаете, например, Exception. Вместо того, чтобы надеяться, что в бесконечном цикле решает проблему, я бы обернул ее «AssetionError», потому что этого не должно произойти, и вы не знаете, как с этим справиться. –

ответ

0

Советуем вам не использовать статический метод, а скорее иметь объект (в конечном счете singleton) с InputStream в качестве поля. Затем вы можете использовать реальный System.in в своем производственном коде и поддельный InputStream в тесте.

Что-то вроде этого:

public class MyStreamReader { 

    private InputStream in; 

    public MyStreamReader(InputStream in) { 
     this.in = in; 
    } 

    public String grabString() { 
     BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
     do { 
      try { 
       // call the readline method of the buffered reader object. 
       return r.readLine(); 
      } catch (Exception e) { 
      } 
     } while (true); 
    } 

} 

В производственном коде, вы будете строить экземпляр с System.in потоком (например new MyStreamReader(System.in)).

В тестах, вы будете тестировать, используя поддельные InputStream:

@Test 
public void testGrabString() throws Exception { 
    String expected = "test input from console"; 
    ByteArrayInputStream fakeIS = new ByteArrayInputStream(expected.getBytes()); 
    MyStreamReader myStreamReader = new MyStreamReader(fakeIS); 

    String actual = myStreamReader.grabString(); 
    assertEquals(expected, actual); 
} 
+0

Кажется, это то, что я искал. Благодарю. – nut0ner

+0

Добро пожаловать. Не могли бы вы отметить это как ответ? –

0

Вы можете использовать Robot класс для этого таким образом, как это:

Robot r = new Robot(); 
r.keyPress(/*Keycode for your input*/); 
r.keyRelease(/*Keycode for your input*/); 

для каждого ключа, который должен быть нажата на клавиатуре.

Но я сомневаюсь, что это имеет смысл, поскольку вы будете тестировать Java API-код, и вы должны предположить, что эти методы работают!

И бесконечный цикл, подобный вашему, не является хорошим способом, чем вы пытаетесь достичь!

+0

В целом следует отметить, что обычно требуется задержка между 'keyPress()' и 'keyRelease()' для приложения для регистрации нажатия клавиши. См. [Здесь] (http://stackoverflow.com/questions/25909039/java-awt-robot-inside-games/25909490#25909490). – bcsb1001

+0

Это верно, конечно, извините, забыл об этом! –

Смежные вопросы