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

时间:2015-03-16 10:43:52

标签: java testing junit io

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

JUnit test for console input and output
JUnit test for System.out.println()

我的任务(学校):

我们要写一个简单的编译器来跟踪铅笔的颜色和x轴和y轴的移动。即。

输入:

  

%这是评论
  %现在我们正在制作一个正方形   DOWN。
  FORW 1. LEFT 90.
  FORW 1. LEFT 90.
  FORW 1. LEFT 90.
  FORW 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

我的问题:

要获得及格分数,我们的代码需要经过一系列严格的测试,其中许多测试都不会让您知道出了什么问题。即。

  

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

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

希望有一种方法可以通过使用现有的文本文件来实现这一点(早先使用assertEquals和超长字符串完成\ n时遇到了一些困难)。澄清:我想测试我的Java程序的I / O(通过文本文件),我找不到任何关于如何做到这一点的明确解释。

2 个答案:

答案 0 :(得分:0)

编写单元测试最重要的部分是将要测试的代码与给定框架中的样板/经过良好测试的代码分开 - 因此您可以创建创建输出的类,但将输入的部分与{{ 1}}并将其写入System.in从您的业务逻辑中集中于"严肃的"部分。

答案 1 :(得分:0)

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

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);
    }

}

然后使用mockito进行测试:

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);
    }

}