2012-09-14 104 views
0

我有一個有趣的需求。我想在我的應用程序中儘可能使用更好的測試用例。我使用參數化的Junit來運行具有不同輸入數量的測試用例。我的示例測試課程如下所示:編寫更好的JUnit參數化測試用例

@Parameters 
public static Collection<Object[]> testInputs() 
{ 
    return Arrays.asList({ 
     {1, CoreMatchers.is(1)}, 
     {2, CoreMatchers.is(2)} 
    }); 
} 
@Test 
public test() 
{ 
    myApp.run(); 
    assertThat(myApp.getA(), matcher); 
} 

這樣,我就用我的測試參數定義了斷言邏輯。現在我想在測試用例上運行多個匹配器,其中一些可以是我編寫的自定義匹配器。

@Parameters 
public static Collection<Object[]> testInputs() 
{ 
    return Arrays.asList({ 
     {1, Arrays.asList(CoreMatchers.is(1), CustomMatchers.status(1)) }, 
     {2, Arrays.asList(CoreMatchers.is(2), CustomMatchers.status(2)) } 
    }); 
} 

和斷言是這樣的:

for(Matcher<MyApp> matcher: matchers) 
{ 
    assertThat(myApp, matcher); 
} 

但問題是,無論是匹配器在不同的對象上運行。什麼是我可以定義我的CustomMatcher的最佳方式?

我應該按照匹配器的類型對斷言進行分類嗎?

我將不勝感激任何幫助。提前致謝。

回答

1

我不確定您的意思是「兩個匹配器運行在不同的對象上」,但您可以使用CoreMatchers.allOf將匹配器組合成單個測試運行。這樣你就不需要遍歷一個匹配器列表,並且可以傳遞任何數量的匹配器,包括一個匹配器。

@Parameters 
public static Collection<Object[]> testInputs() 
{ 
    return Arrays.asList({ 
     {1, CoreMatchers.allOf(CoreMatchers.is(1), CustomMatchers.status(1)) }, 
     {2, CoreMatchers.allOf(CoreMatchers.is(2), CustomMatchers.status(2)) } 
    }); 
} 
1

我不太確定你在問什麼,但我認爲你會更好地使用純粹的java.lang對象而不是JUnit對象作爲參數。所以

return Arrays.asList({ 
    {1, 1}, 
    {2, 2} 
}); 

並在實際測試中使用is匹配器。

如果匹配器做的真的不同,不要使用參數化測試,只需使用單獨的測試方法。爲了減少重複,請使用常用的重構工具來提取測試方法之間的常用方法。