我如何在我的程序中获得 JUnit class 以在提示后向控制台提供字符串输入?

How would I get a JUnit class in my programme to provide String input to the console following a prompt?

我有一个带有 main() 方法的程序,它在 运行 的两个不同时间要求用户输入一行。然后它接受这两行输入并以特定方式比较它们。

我有一个初始化 6 个字符串 (string1, string2,...,string6) 的 JUnit 测试 class,但我不知道如何获取这些字符串并通过将它们发送到 [=13= 来模拟用户输入] 当程序提示用户这样做时。

基本上,在程序的第一个 运行 中,程序会说 "Please enter your first string," 然后稍后会说 "Please enter your second string." 在这两个提示中,我想输入 string1string2 分别来自我的测试 class。然后,在程序的第二个 运行 上,我想输入 string3string4

有办法吗?我试着尽可能地使它易于理解,但我理解我是否正在努力表达我的观点。如果您有任何不明白的地方,请告诉我,我会尽力澄清任何模糊的细节。

您应该重构代码并将执行计算的部分与从控制台获取输入的部分分开。然后,通过将必要的输入作为参数传递,您可以非常轻松地为执行计算的部分编写测试。与控制台配合使用的部分通常非常简单,不需要测试。

在不重构代码的情况下进行测试相当复杂。您需要将 System.in 和 System.out 替换为成对的 PipedInputStream 和 PipedOutputStream。然后,您需要启动一个线程,该线程将从连接到 System.out 的 PipedInputStream 中读取数据,并且在它看到输入提示时,将预期的输入写入连接到 System.in.[=10 的 PipedOutputStream =]

您可以使用 TextFromStandardInputStream rule of the library System Rules.

public class YourTest {
  @Rule
  public final TextFromStandardInputStream systemInMock
    = emptyStandardInputStream();

  @Test
  public void test() {
    systemInMock.provideText("first string\nsecond string");
    YourApp.main()
    ...
  }
}