2014-01-14 39 views
0

我想正确验证一个方法,而不管参数排序如何。Java:不同参数排序的测试方法

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

您可以将两个片段假设为两个stude提交的不同代码NTS。并且可以假定的参数的数量可以大到10

在测试情况下,我写,

(片断3)

return compute_speed(3, 1).equals(3); 

这证实片段1但是失败2.我怎样才能让这两个片段通过测试用例?

如果只是有类似,

return compute_speed(distance = 3, time = 1).equals(3); 

在此先感谢...

+0

为什么地球上,你会想要两个方法,名称相同,以两个参数相同,但顺序不同?这是令人困惑的[最好](http://ballinyourcourt.files.wordpress.com/2012/03/shooting-foot1.jpg)。 – assylias

+0

这应该为学生的家庭作业分级,他们不应该因参数的不同排序而受到惩罚! – Curious

+0

是'return compute_speed(3,1).equals(3)|| compute_speed(1,3).equals(3);'足以满足您的需求?不可否认,随着参数数量的增加,它变得很笨重...... –

回答

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

1

我不认为你可以同时拥有测试用例通过。通常,a/b将不等于​​。

事实上,假设片段1和片段2在同一个类中,它甚至不会编译,因为两种方法都具有相同的签名。当两者同样有效时,Java如何选择调用哪个方法?

我看不出有任何理由在这里有多个方法。这就是计算速度所需要的。

Java没有发言权,PL/SQL有,命名参数符号的特点:

speed := compute_speed(distance => 3, time => 1); 

UPDATE

随着问题被更新为不同的学生测试不同类,我会有这样的测试案例:

assertTrue(compute_speed(3, 1).equals(3) || compute_speed(1, 3).equals(3)); 

这将涵盖参数排序的两种情况。

+0

我更新了这个问题,他们不是同一个类,我们可以假设这些是不同学生提交的两份意见书,不应因参加不同的参数排序而受到惩罚! – Curious

+0

排列后验证不同的排序是危险的,因为一个学生将速度定义为时间/距离会通过测试:) – Curious