如何在Java中对读取输入的类进行单元测试?

时间:2011-11-12 18:16:07

标签: java junit io

如何针对从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但是无法弄清楚如何使用它们。

3 个答案:

答案 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个对象。