Java:不同参数排序的测试方法

时间:2014-01-14 17:30:05

标签: java unit-testing testing

无论参数排序如何,我都要正确验证方法。

因此,代码段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);

提前致谢...

2 个答案:

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

您将获得一份未通过测试的详细报告:

enter image description here