无论参数排序如何,我都要正确验证方法。
因此,代码段1和2都应该通过代码段3中的测试用例。
(摘录1)
public Integer compute_speed(Integer distance, Integer time) {
return distance/time;
}
(摘录2)
public Integer compute_speed(Integer time, Integer distance) {
return distance/time;
}
您可以将两个片段视为两名学生提交的不同代码。并且您可以假设参数的数量可以大到10。
在测试用例中,我写道,
(摘录3)
return compute_speed(3, 1).equals(3);
这会验证代码段1,但会失败2.我怎样才能使两个代码段都通过测试用例?
如果只有类似的东西,
return compute_speed(distance = 3, time = 1).equals(3);
提前致谢...
答案 0 :(得分:1)
我认为你不能同时通过两个测试用例。通常,a/b
不等于b/a
。
实际上,假设片段1和2在同一个类中,它甚至不会编译,因为两个方法都具有相同的签名。当两者同样有效时,Java如何选择调用哪个方法?
我认为没有理由在这里有多个方法。这就是计算速度所需要的一切。
Java没有命名参数表示法的功能,例如,PL / SQL具有:
speed := compute_speed(distance => 3, time => 1);
<强>更新强>
随着问题被更新以测试来自不同学生的不同课程,我会有一个这样的测试用例:
assertTrue(compute_speed(3, 1).equals(3) || compute_speed(1, 3).equals(3));
这将涵盖参数排序的两种情况。
答案 1 :(得分:1)
更简洁的方法是使用Integer computeSpeed(Integer time, Integer distance);
方法创建接口:
public interface DistanceCalculator {
Integer computeSpeed(Integer distance, Integer time);
}
然后,您要求学生实施它并调用他们的实现StudentNameDistanceCalculator。例如,您将收到学生的以下课程:
public class AssyliasDistanceCalculator implements DistanceCalculator {
public Integer computeSpeed(Integer distance, Integer time) {
return distance / time;
}
}
public class BobDistanceCalculator implements DistanceCalculator {
public Integer computeSpeed(Integer distance, Integer time) {
return distance / time * 2;
}
}
然后,您可以在一个项目中加载所有类,并立即测试所有类。例如,使用TestNg:
@Test(dataProvider = "students")
public void testMethod(Class<?> clazz) throws Exception {
DistanceCalculator dc = (DistanceCalculator) clazz.newInstance();
assertEquals(dc.computeSpeed(3, 1), (Integer) 3,
clazz.getSimpleName().replace("DistanceCalculator", "") + " failed");
}
@DataProvider(name = "students")
public Object[][] dataProvider() {
return new Object[][]{
{AssyliasDistanceCalculator.class},
{BobDistanceCalculator.class}};
}
您将获得一份未通过测试的详细报告: