【发布时间】:2016-10-22 16:23:36
【问题描述】:
这和这个问题不一样:JUnit: How to simulate System.in testing?,是关于模拟标准输入的。
我想知道的是如何测试(如在 TDD 中)一个带有 main 方法的简单 Java 类等待输入。
我的测试:
@Test
public void appRunShouldWaitForInput(){
long startMillis = System.currentTimeMillis();
// NB obviously you'd want to run this next line in a separate thread with some sort of timeout mechanism...
// that's an implementation detail I've omitted for the sake of avoiding clutter!
App.main( null );
long endMillis = System.currentTimeMillis();
assertThat( endMillis - startMillis ).isGreaterThan( 1000L );
}
我的 SUT main:
public static void main(String args[]) {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter something : ");
String input = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
... 测试失败。代码不等待。但是当您在命令提示符下运行应用程序时,它确实会等待。
注意,顺便说一句,我也尝试将 stdin 设置为其他:
System.setIn(new ByteArrayInputStream( dummy.getBytes()));
scanner = new Scanner(System.in);
...这没有通过测试。
【问题讨论】:
-
如果它确实等待输入,您的测试将永远等待。另外,你真的认为这是一个很好的测试吗?它不是在测试您的代码,而是在测试
BufferedReader。 -
如果你真的想测试
BufferedReader,那么你链接的帖子就是你需要的。请记住,TDD 或任何测试的想法不是测试由他人开发(并希望测试)的代码。测试readLine()是否阻塞直到它收到\n是非常荒谬的。 -
(稍作修改以显示我正在尝试做的事情)。我不认为这是关于测试
BufferedReader。没有br.readLine()行的main方法会立即返回:所以我需要一个测试来证明包含该行的合理性。如果该行应用程序代码随后因某种原因被删除或未执行,我希望此测试失败。一个简单的事实是br.readLine()在从我的测试方法运行应用程序类时绝对不会阻塞。为什么不呢? -
因为
System.in不是您在正常运行 CLI 程序时所期望的标准输入。我想它是空的。 -
感谢您一直以来的关注...不过,我认为这不太正确:请参阅我添加的代码:我已尝试将
stdin设置为其他...
标签: java unit-testing stdin