2015-01-11 3 views
0

Мне нужно проверить основной метод, я хочу отправить материал в 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)); 

    } 
} 

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

ответ

0

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

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

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

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

+0

У меня есть основные методы, и я должен рулон с этим. – mist

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