如何在java中测试输出/输入

如何在java中测试输出/输入,java,testing,junit,io,Java,Testing,Junit,Io,我知道这可能是一个重复(如果是这样的话,请原谅我),这两个中的任何一个都可能是我正在搜索的内容的重复,但是我不知道他们是否回答了我的问题,我将在这里询问 , 我的作业(学校): 我们将编写一个简单的编译器,它可以跟踪铅笔的颜色以及在x轴和y轴上的运动。i、 e 输入: %这是一条评论 %现在我们正在做一个正方形 向下。 福鲁1。左90。 福鲁1。左90。 福鲁1。左90。 福鲁1。左90 输出: #0000FF 0.0000 0.0000 1.0000 0.0000 #0000FF 1.000

我知道这可能是一个重复(如果是这样的话,请原谅我),这两个中的任何一个都可能是我正在搜索的内容的重复,但是我不知道他们是否回答了我的问题,我将在这里询问


我的作业(学校):

我们将编写一个简单的编译器,它可以跟踪铅笔的颜色以及在x轴和y轴上的运动。i、 e

输入:

%这是一条评论
%现在我们正在做一个正方形
向下。
福鲁1。左90。
福鲁1。左90。
福鲁1。左90。
福鲁1。左90

输出:

#0000FF 0.0000 0.0000 1.0000 0.0000
#0000FF 1.0000 0.0000 1.0000 1.0000
#0000FF 1.0000 1.0000 0.0000 1.0000
#0000FF 0.0000 1.0000 0.0000 0.0000

我的问题是:

为了获得及格分数,我们的代码要经过一系列严格的测试,其中许多测试都没有告诉您出了什么问题。i、 e

1215字节上随机生成的程序,有1个语法错误

所以我觉得这项任务的很大一部分是学习如何编写好的测试代码,我一直在考虑尝试使用JUnit(或者我应该使用其他东西?)。我的输入来自System.in,输出通过System.out.println()


希望有一种方法可以通过使用现有的文本文件来做到这一点(在前面使用assertEquals和充满\n的超长字符串时遇到了一些困难)。澄清一下:我想测试I/O(通过文本文件)编写单元测试最重要的部分是将要测试的代码与给定框架中的样板代码/经过良好测试的代码分离开来,因此您可以创建创建输出的类,但将读取输入的部分与
System.in
并将其写入业务逻辑中的
System.out
,以专注于“严重的”部分。

我最近在重构一些遗留代码时遇到了这个问题。我将输入/输出提取到新类中,并使它们成为程序的依赖项。使用依赖注入,我插入了mock/fakes,这样我就可以定义什么是输入,什么是输出

public class InputReader {

    private static final Scanner SCANNER = new Scanner(System.in);

    public String nextLine() {
        return SCANNER.nextLine();
    }

}

public class OutputPrinter {

    public void println(String string) {
        System.out.println(string);
    }

}
然后使用以下方法进行测试:

public class MainProgramTest {

    private final InputReader inputReader = mock(InputReader.class);
    private final OutputPrinter outputPrinter = mock(OutputPrinter.class);

    @Test
    public void playsSimpleGame() {
        when(inputReader.nextLine())
                .thenReturn("hello")
                .thenReturn("help")
                .thenReturn("exit");

        MainProgram mainProgram = new MainProgram(inputReader, outputPrinter);
        mainProgram.run();

        InOrder inOrder = inOrder(inputReader, outputPrinter);
        inOrder.verify(inputReader).nextLine(); // -> "hello"
        inOrder.verify(outputPrinter).println("\"hello\" is not recognised command, type \"help\" for known commands");
        inOrder.verify(inputReader).nextLine(); // -> "help"
        inOrder.verify(outputPrinter).println("This is help, the only known commands are \"help\" and \"exit\"");
        inOrder.verify(inputReader).nextLine(); // -> "exit"
        inOrder.verify(outputPrinter).println("Goodbye");
        verifyNoMoreInteractions(inputReader, outputPrinter);
    }

}