模拟多个用户输入junit

时间:2017-04-23 16:28:48

标签: java junit java.util.scanner

我正在尝试编写一个junit测试来测试一个需要多个用户输入的方法。 该方法采用person对象并为它们设置评级,第一个用户输入是评级的double值,第二个输入是值为“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;
}

这是用于确认Y / N输入

    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;
}

1 个答案:

答案 0 :(得分:1)

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

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

因为这可以帮助您发现所需的抽象。在您的情况下:为了验证您的Person类中的输入值, 不重要,这些值来自哪里。

换句话说:你做从来没有jamais 将System.in读取调用放入生产类。您可能有一个测试main方法从控制台读取值;但是你总是将传递这样的值作为参数传递给方法。如果有的话,您将实例 Reader 传递到您的类中。你在方法中转向System.in!