我知道这可能是重复的(如果是这样的话,请原谅我),这两者中的任何一个都可能与我正在搜索的内容重复,但我不知道他们是否回答了我的问题问题无论如何我都会在这里问。
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(通过文本文件),我找不到任何关于如何做到这一点的明确解释。
答案 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);
}
}