2014-01-14 41 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