我该如何在程序中获得一个JUnit类,以便在提示后向控制台提供String输入



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

我有一个JUnit测试类,它初始化6个字符串(string1, string2,...,string6),但我不知道如何在程序提示用户时将这些字符串发送到System.in来模拟用户输入

从本质上讲,在程序的第一次运行时,程序会说,"请输入你的第一个字符串",然后会说"请输入第二个字符串"。在这两个提示下,我想从我的测试课上分别输入string1string2。然后,在程序的第二次运行中,我想输入string3string4

有办法做到这一点吗?我试着让这件事尽可能容易理解,但如果我很难理解我的观点,我也能理解。如果你有什么不明白的地方,请告诉我,我会尽我所能澄清任何模糊的细节。

您应该重构代码,并将执行计算的部分与从控制台获取输入的部分分离。然后,通过将必要的输入作为参数传递,您可以非常容易地为执行计算的零件编写测试。与控制台一起工作的部分通常非常简单,不需要测试。

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

您可以使用库系统规则的TextFromStandardInputStream规则。

public class YourTest {
  @Rule
  public final TextFromStandardInputStream systemInMock
    = emptyStandardInputStream();
  @Test
  public void test() {
    systemInMock.provideText("first stringnsecond string");
    YourApp.main()
    ...
  }
}

最新更新