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