2015-06-01 133 views
1

假設我有一個接口和兩個類都實現它。所以我們有接口I,類A和B.對於這兩個類,我們需要使用JUnit4測試相同的實現函數doSomething()。有一些依賴關係,所以我們使用Mockito。示例測試如下所示:用1個測試測試多個類

@Mock private dependantClass d; 

@Test 
public void test() { 
    A.doSomething(); 
    verify(d).expectedBehavior(); 
} 

我已經爲A(4測試)編寫了測試套件,沒有問題。但是,現在我必須重構測試套件,以便可以在A和B對象上執行相同的測試類。爲此,我應該使用並行類層次結構。

這讓我難倒了。我試過使用@Parameters註解,但是這給我錯誤,我有太多的輸入參數。我試過做一個ATest和BTest擴展的超級測試類,但我猜測我沒有做正確的,因爲我得到了空指針異常。

實際上覆制所有的測試用例,只是將A更改爲B通過了所有的測試,也就是說這兩個類都是相同的。我意識到這聽起來像錯誤的設計,說實話,它可能是。但是,我沒有可能改變代碼,我只需要測試它。

我只是在做錯事嗎?我應該如何實現這一點?

+3

請顯示您如何嘗試參數化您的測試。這是正確的做法,你可能錯過了一些小事。 – dasblinkenlight

+1

我想知道爲什麼[參數化測試](https://github.com/junit-team/junit/wiki/Parameterized-tests)在你的情況下失敗。你可以發佈一個片段在你的嘗試嗎? –

+1

這是@Parameters的一個相當常見的用例,所以您可能需要顯示該嘗試的一些細節。 「太多的輸入參數」可能是一個簡單的錯誤(如與構造函數的簽名不匹配),如果您發佈該代碼,可能會被診斷出來。 – sprinter

回答

0

你可以嘗試的JUnit理論:

@RunWith(Theories.class) 
public class AdditionWithTheoriesTest { 
    private dependantClass d; 

    @Before 
    public void before() { 
    d = mock(dependantClass); 
    } 

    @DataPoints 
    public static I[] positiveIntegers() { 
    return new I[]{ 
     new A(d),   //inject d into A, may differ 
     new B(d)   //inject d into B, may differ 
    }; 

    } 

    @Theory 
    public void test(I data) { 
    data.doSomething(); 
    verify(d).expectedBehavior(); 
    } 

這也可以用@Parameters進行(如果配置正確)。然而@Parameters更適合測試一個具有多個數據的類。 @Theories意味着在不同的參數(例如多個類)上聲明相同的行爲。

+0

你可能是指'data.doSomething()'而你正在從靜態上下文訪問'd',這是行不通的 –