java - 我们如何模拟 Ctrl+C 来阻止控制台应用程序等待 java 中的用户输入

标签 java

我正在尝试测试在每一步之后等待用户输入的命令行应用程序。我可以使用 System Rules 测试应用程序由斯特凡伯克纳提供。目前,我提供从头到尾的输入,这就像一个魅力,我可以断言系统日志的最终输出。

但是,我想在应用程序结束之前测试负面情况,我在开始时为其提供无效输入以评估错误消息。当给出无效输入时,控制台会打印一条错误消息并一直等待用户提供有效输入。如何使用如下所示发送 Ctrl+C:

systemInMock.provideLines(Ctrl+C);

systemInMock.provideLines 只接受字符串。有没有办法发送 Ctrl+C 信号?

我的 junit 测试示例如下所示:

@Test
public void testInValidMarker() throws Exception{
    systemInMock.provideLines("abc","def","1");
    Main.main(new String[]{});
    assertTrue(systemOutRule.getLog().contains("Invalid marker, try again"));
}

感谢您的帮助!

最佳答案

如果我没记错的话,当你执行 ctrl+c 时,它实际上并没有写入控制台。如果那是真的,那么在任何情况下都不会为您的程序提供 ctrl+c,因此 provideLines 永远不会处于提供 ctrl+c 的位置.

为了证明,打开 cmd 并输入带有程序参数的程序(在我的例子中,我使用 ant)。如果您键入 ant,然后键入 ctrl+c,光标将移动到新的一行。

有两种方法可以控制终止行为:

  1. 您可以使用 shutdown hook (从这个 previously asked question 找到)。这样做可以让您处理发生的事情(可能有问题)。
  2. 或者您可以创建自己的终止参数,如 -qq,这将触发结束程序的操作(可能是 System.exit( 1))。这样您就可以模拟该输入。

关于java - 我们如何模拟 Ctrl+C 来阻止控制台应用程序等待 java 中的用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44030359/

相关文章:

java - 使用 ServerSockets 和套接字的多线程 JUnit 测试

java - 如何使用 lambda 或流从包含另一个对象列表列表的对象列表中迭代并获取对象

java - IBM Websphere 包的 Maven 依赖项

Java 异步 MongoDB 驱动程序和 RxJava2 Observables

java - 如何从嵌入式 Jython 中调用 java 函数?

java - org.jdom2.xpath 不返回 html head 元素的查询结果

java - 使用增强型 for 循环进行计数

java - 在javafx中加载多个fxml

java - 默认情况下枚举的实例是静态的吗?

java - 存储 ArrayList 中的重叠日期