我的任务是编写一个测试程序来评估学生的作业是否有效。
学生们正在用 Java 编写一个石头、剪刀、布游戏,并提交一个类,通过要求用户在命令行中输入来玩 n 轮游戏。
所有这些学生都将使用一个或多个 Scanner 对象从控制台读取输入,因此我需要让我的测试程序模拟一些预定的输入并检查预期的输出。
我重写 System.in,因此当学生调用 Scanner myReader = new Scanner(System.in);
时,我可以指定输入是什么(使用 ByteArrayInputStream)。
要了解我是如何开始的:
public class TestRockPaperScissors extends RockPaperScissors{
public static void main(String[] args){
InputStream stdin = System.in;
try {
System.setIn(new ByteArrayInputStream("<test inputs here>".getBytes()));
RockPaperScissors.main(null); // This will be student code in another file.
} finally {
System.setIn(stdin);
}
}
问题是,这仅在学生仅使用 System.in 创建单个扫描仪时才有效。否则,我会收到错误,因为没有输入可供第二个扫描仪使用 .next() 。
TL;DR...如果我看不到 RockPaperScissors.main(null) 调用的源,如何模拟任意数量的扫描仪的控制台输入?
最佳答案
您可以使用 System Rules 的 StandardOutputStreamLog
和 TextFromStandardInputStream
规则为命令行界面编写更清晰的测试。图书馆。
public class RockPaperScissorsTest() {
@Rule
public StandardOutputStreamLog log = new StandardOutputStreamLog();
@Rule
public TextFromStandardInputStream systemInMock = emptyStandardInputStream();
@Test
public void test1() {
systemInMock.provideText("<test input>");
RockPaperScissors.main(null);
assertTrue(log.getLog().contains("<expected output>"));
}
@Test
public void test2() {
systemInMock.provideText("<another test input>");
RockPaperScissors.main(null);
assertTrue(log.getLog().contains("<expected output>"));
}
}
关于java - 更改 System.in 并使扫描仪使用一个 ByteArrayInputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14918372/