0

我必须测试一个主要方法,我想将东西发送到 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));

    }
}

有更好的方法吗?我可以使用一些技巧,以便在检查一些中间输出后将内容发送到输入吗?可能是我可以用来一直发送新行的输入流实现?可能还有一些我可以用来查看中间输出的打印流?

4

1 回答 1

0

执行此操作的正常方法是启动一个新进程并在为其提供输入的同时读取该进程的输出。这允许您运行 a) 一次以上其中一个或 b) 在程序的测试方中自然地使用控制台。

在进程中执行此操作是启动一个线程,该线程生成测试代码的输入,另一个使用管道读取它。

通常如何进行测试是通过单元测试。您测试的组件接受输入给它的任何源(它可以是 System.in 或测试提供的输入)并且您的组件进行回调(或者您必须在您提供的输出中)有许多库需要支持检查回调是否创建了预期的事件。

通过这种方式,您可以在一个线程中以交互方式隔离地测试组件,而开销很小。

于 2015-01-11T09:59:45.100 回答