我必须测试一个main方法,我想将内容发送到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 :(得分:0)
执行此操作的常规方法是启动新进程并在输入进程时读取进程的输出。这允许您同时运行a)多个这些或b)在程序的测试方中自然地使用控制台。
在过程中执行此操作是启动一个生成测试代码输入的线程,另一个使用管道读取它。
通常如何通过单元测试进行测试。您测试为其提供的任何源(可能是System.in或测试提供的输入)获取输入的组件,并且您的组件进行回调(或者您必须输入您提供的输出)有许多库需要支持检查回调是否创建了预期的事件。
通过这种方式,您可以在一个线程中以交互方式单独测试组件,而且开销很小。