如何针对从System.in读取用户输入的类运行测试?
例如:
private int getUserInput() {
Scanner scanner = new Scanner(System.in);
System.out.print("What's ya input? [1-3]: ");
return scanner.nextInt();
}
我认为可能是对主类进行子类化并覆盖getUserInput来反馈脚本化的答案。虽然如果您需要阅读System.out以确定输入,这将无法工作。
我花了几个小时查找Threads但是无法弄清楚如何使用它们。
答案 0 :(得分:13)
好吧,你可以使用System.in
替换System.setIn()
,但我不赞成这种做法。设置全局状态总是会使您的测试更加脆弱和不透明。
相反,您应该尝试打破依赖关系,例如通过类的构造函数将要读取的InputStream
注入到类中。完成后,当您对其进行单元测试时,您可以传入自己的InputStream
来读取静态数据,并在生产代码中注入System.in
。
答案 1 :(得分:2)
将对System.in和System.out的引用放到变量或结果中可以在测试中覆盖的方法的值(通过其他流,如ByteArrayInput / OutputStream,或者(如果不可能)使用System .setOut和System.setIn来替换默认流,运行测试,验证输出并将其设置回来。
答案 2 :(得分:2)
您可以创建模仿用户输入的Mock个对象。