Вынести код, который читает клавиатуру, сделать его интерфейсом.Затем создайте две реализации, одну для производства, которая выполняет «настоящий» код Java для чтения с клавиатуры;второй может быть доступен из кода, в частности из вашего теста JUnit.
Используя последний, ваш тест может «напечатать» любой необходимый ввод.
Добавлено:
Это недопустимый код,Я набираю это из головы! Это также только один из способов сделать это: подход gpampara, приведенный ниже, для создания ваших собственных потоков также будет работать.Это зависит от ваших потребностей в тестировании.
Сначала создайте интерфейс
public interface Keyboard
{
public int getInt() ;
}
Затем «реальная» реализация:
public class RealKeyboard
implements Keyboard
{
// I haven't done Java keyboard reading in ages, so this is
// likely not how to do it, but you should get the idea
private BufferedReader __r ;
public RealKeyboard( BufferedReader r )
{
__r = r ;
}
public int getInt()
{
// whatever you need to do with __r
}
}
Тогда вот одна из возможных реализаций теста:
public class TestKeyboard
implements Keyboard
{
private int __value ;
public TestKeyboard( int value )
{
__value = value ;
}
public int getInt()
{
return __value ;
}
}
Это, конечно, всегда будет возвращать одно и то же значение, что, вероятно, не то, что вы хотите.Вы можете сделать реализацию с помощью метода setInt (), чтобы ваш тестовый класс мог установить значение во время теста, или вы могли бы передать список значений конструктору и возвращать каждое из них по порядку.Зависит от того, что вам нужно проверить.
Тогда ваш код вызова просто передается одному из них:
public class SomeConsumer
{
private Keyboard __k ;
public SomeConsumer( Keyboard k )
{
__k = k ;
}
// use it in your methods...
}
Вы можете использовать Spring для его внедрения или просто жестко закодировать его в своем«производственный» код.Но в ваших тестах вы можете пройти одну из ваших тестовых реализаций.