2010-09-28 3 views
8

В нашем приложении, мы ожидаем, что ввод данных пользователя в пределах Thread следующим образом:Запись данные на System.in

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

Я хочу передать эту часть в моем модульном тестировании, так что я могу возобновить поток, чтобы выполнить остаток кода. Как я могу написать что-то в System.in из junit?

+1

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

+0

@Bart, если вы тестируете приложение, которое вводит данные из 'System.in', в конце концов вам нужно будет протестировать модуль, который берет данные из' System.in'. – jjnguy

+2

@Justin Разве это не тестирование Java, а не ваш код? Если вы введете InputStream, вы все еще проверяете весь свой код и в зависимости от Java, чтобы обеспечить правильный System.in. –

ответ

20

Что вы хотите сделать, это использовать метод setIn() от System. Это позволит вам передавать данные в System.in из junit.

+0

Это работает, когда я запускаю тесты JUnit индивидуально, но когда я запускаю весь класс, моя программа, похоже, останавливается в тех точках, где должен работать setIn(). У кого-нибудь еще есть эта проблема, и если да, то какие-нибудь идеи о том, как обойти это? – decal

+0

@decal Возможно, проблема была неправильной установкой() & tearDown(), изменяющей эти значения System.in() и System.out(). Есть еще некоторые ссылки на эту проблему в другом месте на SE. Если кто-то еще увидит этот комментарий, я буду искать и заменять. – Crowie

9

Замените его на время теста:

String data = "the text you want to send"; 
InputStream testInput = new ByteArrayInputStream(data.getBytes("UTF-8")); 
InputStream old = System.in; 
try { 
    System.setIn(testInput); 

    ... 
} finally { 
    System.setIn(old); 
} 
+0

Маленькая деталь: поскольку буферизованный читатель построен без кодировки, вы не должны вызывать 'getBytes()' без кодировки (или, конечно, добавить кодировка для буферизатора)? –

5

Вместо вышеуказанных предложений (редактировать: Я заметил, что Барт оставил эту идею в комментариях, а), я бы предложил сделать свой класс большее количество единиц, проверяемых путем принятия классом входного источника в качестве параметра конструктора или аналогичного (вводят зависимость). В любом случае класс не должен быть так связан с System.in.

Если ваш класс построен из ридера, вы можете просто сделать это:

class SomeUnit { 
    private final BufferedReader br; 
    public SomeUnit(Reader r) { 
     br = new BufferedReader(r); 
    } 
    //... 
} 

//in your real code: 
SomeUnit unit = new SomeUnit(new InputStreamReader(System.in)); 

//in your JUnit test (e.g.): 
SomeUnit unit = new SomeUnit(new StringReader("here's the input\nline 2")); 
Смежные вопросы