System.in, System.out из строк

Мне нужно протестировать основной метод, я хочу отправить данные в System.in, а затем посмотреть, что выйдет из System.out.

Я делаю это так:

public class Check3_1 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        InputStream originalIn = System.in;
        PrintStream originalOut = System.out;

        String input = "steve\n";
        String expectedOutput = "Hello, steve";
        InputStream stream = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8));
//      BufferedInputStream bis = new
        ByteArrayInputStream bais = new ByteArrayInputStream(new byte[100]);
        ByteArrayOutputStream baos = new ByteArrayOutputStream(100);
        PrintStream ps = new PrintStream(baos);

        System.setIn(bais);
        System.setOut(ps);
        Homework_3.main(args);
        String output = baos.toString(StandardCharsets.UTF_8.name());

        System.setIn(originalIn);
        System.setOut(originalOut);

        System.out.println("actual output: "+output);
        System.out.println("correct?: "+output.equals(expectedOutput));

    }
}

Есть ли лучший способ сделать это? Есть ли какой-нибудь трюк, который я могу использовать, чтобы отправлять данные на ввод после проверки промежуточного вывода? Возможно, реализация потока ввода, которую я могу использовать для постоянной отправки новых строк? И, возможно, какой-то поток печати, который я могу использовать, чтобы увидеть какой-то промежуточный вывод?


person mist    schedule 11.01.2015    source источник


Ответы (1)


Обычный способ сделать это — запустить новый процесс и прочитать его выходные данные, подавая ему входные данные. Это позволяет вам запускать либо а) более одного из них одновременно, либо б) естественно использовать консоль в тестовой части программы.

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

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

Таким образом, вы можете протестировать компонент изолированно, интерактивно в одном потоке с очень небольшими накладными расходами.

person Peter Lawrey    schedule 11.01.2015
comment
У меня есть основные методы, и я должен с этим смириться. - person mist; 11.01.2015