使用Scanner和System.in(Java)对方法进行Junit测试

使用Scanner和System.in(Java)对方法进行Junit测试,java,junit,java.util.scanner,system.in,Java,Junit,Java.util.scanner,System.in,我是编程新手,我有一个简单的方法: public double input() { double result = 0; Scanner scanner = new Scanner(System.in); if (scanner.hasNextDouble()) { result = scanner.nextDouble(); } else { System.out.print("Pl

我是编程新手,我有一个简单的方法:

public double input() {
        double result = 0;
        Scanner scanner = new Scanner(System.in);
        if (scanner.hasNextDouble()) {
            result = scanner.nextDouble();
        } else {
            System.out.print("Please, type numbers!\n");
        }
        return result;
    }

问题是如何在junit测试中模拟(模拟)用户从键盘输入。

扫描仪作为输入参数传递给要测试的方法。
在测试代码中,您可以从字符串创建
扫描程序
实例:

Scanner scanner = new Scanner("the sample user input");

然后在生产代码中,您可以将
新扫描仪(System.in)
传递给该方法。

您应该了解更多信息

你的课程不应该与其他课程紧密结合。可以根据需要在多个级别为对象提供依赖关系

  • 如果是字段,则使用构造函数/设置器
  • 如果范围仅在方法中,则使用方法参数
  • 就你而言,只要你说:-

    Scanner scanner = new Scanner(System.in);
    
    现在,您的代码与
    流中的
    系统完全耦合。相反,您应该以下面的格式将其作为参数注入到方法中

    public double input(InputStream inputStream) {
        double result = 0;
        Scanner scanner = new Scanner(inputStream);
        if (scanner.hasNextDouble()) {
            result = scanner.nextDouble();
        } else {
            System.out.print("Please, type numbers!\n");
        }
        return result;
    }
    
    现在,您可以从主代码中使用
    System.in
    调用它。从测试类中,可以使用任何InputStream调用它。我们通常使用
    mock/stub

    注意:-上面只是一个示例,可以根据需要进行更改