Java:如何自动测试从用户获取输入的控制台应用程序

时间:2016-12-02 09:04:04

标签: java file testing java.util.scanner

我正在用Java编写一个控制台应用程序来获取用户的输入 '扫描器'类。每次我在控制台中手动测试我的程序输入时,我都不想输入,所以我想将所有输入放在一个文本文件中,让Java程序读取这个文本文件,而不是再输入输入。

我发现这样做的方法是改变这条线:

Scanner sc = new Scanner(System.in);

到:

Scanner sc = new Scanner(new File(path_to_text_file));

您能否推荐另一种不涉及更改代码的方法?

2 个答案:

答案 0 :(得分:1)

如果您无法更改代码,请使用System.setIn替换您选择的默认输入流。

确保在完成测试后始终将流更改回原始流 - 在这样做时,您正在改变全局状态,因此您可以在其余测试中将事物置于错误状态。 / p>

InputStream previousIn = System.in;
InputStream replacement = new FileInputStream(path_to_text_file);
System.setIn(replacement);
try {
  // ... Do your testing.
} finally {
  System.setIn(previousIn);
}

或者,更改代码的设计,以便inject the input stream that you depend on。这避免了全局状态的突变,这是一件好事。

答案 1 :(得分:1)

由于您希望将其用于测试,因此最好的方法是为此类编写测试。看看JUnit

在这样的测试中,您可以使用

为原始类提供不同的扫描仪

Scanner sc = new Scanner(new File(path_to_text_file));

或者您可以使用像Mockito这样的框架,以便通过扫描程序伪造不同的用户输入,然后检查这些输入是否产生了正确的输出。