我遇到了类似的问题,这就是我最终要做的。
首先,我建议按照@Jon-Skeet 的建议做,而不是使用main(String[])
类的方法,而是创建一个单独的方法。
然后,您可以让该方法将 anInputStream
作为参数,然后Scanner
在使用传递InputStream
的作为其源的方法中创建一个对象。这样,您可以在调用方法时将任何InputStream
,例如传递给方法(下文详述)。System.in
package my.package;
import ...;
public class MyClass
{
public static void myMethod(InputStream inputStream)
{
Scanner inputScanner = new Scanner(inputStream);
// Do stuff with the Scanner such as...
String input = inputScanner.nextLine();
System.out.println("You inputted " + input);
}
}
现在,在您的生产源代码中,您可以调用myMethod
它并将其System.in
作为参数传递,myMethod(System.in);
然后在您的单元测试中,您可以通过以下方式创建模拟输入值ByteArrayInputStream
:
package my.package;
import ...;
public class MyClassTest
{
@Test
void testMyMethod()
{
// Simulates a user inputting the string "Mock input" and hitting enter
assertDoesNotThrow(myMethod(new ByteArrayInputStream("Mock input\n".getBytes())));
}
}
瞧,您现在有了一种方法来传递您的方法模拟输入,并且它整体上更加模块化。
我只想指出,但不要过多介绍,当使用 时System.in
,需要小心关闭它,在使用输入流时的单元测试中,需要小心重用与其相同的InputStream
引用状态可以跨用途持续存在。