Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模拟多用户输入junit_Java_Junit_Java.util.scanner - Fatal编程技术网

Java 模拟多用户输入junit

Java 模拟多用户输入junit,java,junit,java.util.scanner,Java,Junit,Java.util.scanner,我试图编写一个junit测试来测试一个接受多个用户输入的方法。 该方法获取person对象并为其设置分级,第一个用户输入是分级的双倍值,第二个输入是值为“Y”的字符串以确认更改 我试图使用ByteArrayInputStream,但它没有得到第二个输入,运行测试时出现的错误是找不到行 我已经发现了问题,因为我使用不同的方法验证用户输入,每次我都必须创建一个新的扫描仪,所以第二行不被接受 有没有办法为第二次输入再次设置扫描仪 这是我的测试代码 Person p = new Person();

我试图编写一个junit测试来测试一个接受多个用户输入的方法。 该方法获取person对象并为其设置分级,第一个用户输入是分级的双倍值,第二个输入是值为“Y”的字符串以确认更改

我试图使用ByteArrayInputStream,但它没有得到第二个输入,运行测试时出现的错误是找不到行

我已经发现了问题,因为我使用不同的方法验证用户输入,每次我都必须创建一个新的扫描仪,所以第二行不被接受

有没有办法为第二次输入再次设置扫描仪

这是我的测试代码

 Person p = new Person();

    double input1 = 54.3;
    String input2 = "Y";

    String simulatedUserInput = input1 + 
    System.getProperty("line.separator")
    + input2 + System.getProperty("line.separator");


    System.setIn(new ByteArrayInputStream(simulatedUserInput.getBytes(StandardCharsets.UTF_8)));

    addRating(p);

    assertEquals(54.3, p.getMyRating(),0);
添加评级的方法如下所示

    public static void addRating(Person p)
{

    double rating = Validation.validateRating("Please enter a rating for " + p.getName()); // validate input of double

    boolean confirmed = Validation.validateYesNo("Are you sure you wish to set " + p.getName() + "'s rating to " + rating + " Y/N");// confirm yes no

    if (confirmed) 
    {
        p.setMyRating(rating);
    }

}
然后我有一个验证类来确保正确的用户输入, 这是为了评级

    public static double validateRating(String str)
{
    Scanner in = new Scanner(System.in);
    double d = 0;
    boolean valid = false;
    while (!valid)
    {
        System.out.println(str);
        if (!in.hasNextDouble())
        {
            System.out.println("Not a valid number");
            in.nextLine();
        } else
        {

            d = in.nextDouble();

            if(d>=0 && d<=100)
            {
               valid = true; 
            }
            else
            {
                System.out.println("Rating must be between 0 and 100");
            }

        }
    }
    return d;
}

单元测试是错误的。您不需要先编写生产代码;后来发现:这是非常难测试的

相反:从一开始,您就努力编写尽可能简单的代码。理想情况下,您甚至可以在编写生产代码之前编写测试用例

因为这有助于你发现你需要的抽象概念。在您的情况下:为了验证Person类中的输入值,这些值的来源应该不重要

换句话说:您不必将System.In读取调用放入生产类中。您可能有一个test
main
方法从控制台读取值;但是您总是将这些值作为参数传递到方法中。如果有的话,将实例读取器传递到类中。你不必在你的方法中使用System.in

System.setIn(
对于单元测试来说,这看起来非常难看。重新构造代码,将输入字符串作为参数,并从单元测试中调用该方法。在实时代码中,读取字符串并将其作为参数传递很容易,因此不再需要实际测试
System.In
    public static boolean validateYesNo(String str)
{
    Scanner in = new Scanner(System.in);
    boolean YesNo = false;
    boolean valid = false;

    while (!valid)
    {
        System.out.println(str);
        String choice = in.next();
        if (choice.equalsIgnoreCase("Y"))
        {
            valid = true;
            YesNo = true;
        } else if (choice.equalsIgnoreCase("N"))
        {
            valid = true;
            YesNo = false;
        } else
        {
            System.out.println("Invalid input");
        }
    }
    return YesNo;
}