2012-09-11 21 views
0

是否可以根據@Parameters方法的參數更改斷言行爲?根據參數化Junit測試用例中的不同參數更改斷言行爲

Class abcTest 
{ 
    .. 
    @Parameters 
    public static Collection<Object[]> testParameters() 
    { 
     return Arrays.asList(new Object[][] { 
     {1},{2} 
     }); 
    } 

    .. 
    @Test 
    public void test() 
    { 
    ... 
    if(num == 1) { assertTrue(..); } 
    if(num == 2) { assertFalse(..); } 
    ... 
    } 
} 

是否有可能完全按照我們定義參數的方式定義斷言行爲?

在此先感謝。

回答

4

在最簡單的情況下,您可以將期望值作爲參數傳遞並在斷言中使用它們,如javadoc中所示。

在更復雜的情況下,您需要將斷言邏輯封裝到對象中並將它們作爲參數傳遞。

如果你需要不同的斷言爲相同的值,你可以使用assertThat()Matcher<T>

class abcTest 
{ 
    @Parameters 
    public static Collection<Object[]> testParameters() 
    { 
     return Arrays.asList(new Object[][] { 
      {1, CoreMatchers.is(true)}, 
      {2, CoreMatchers.is(false)} 
     }); 
    } 

    .. 
    @Test 
    public void test() 
    { 
     ... 
     assertThat(value, matcher); 
    } 
} 

否則,如果不同的參數需要完全不同的說法,你可以將它們作爲Runnable秒。

但是,在這種情況下使用參數化測試可能不是一個好主意 - 如果對不同情況需要完全不同的斷言,爲這些情況創建單獨的測試方法會更加優雅,將其公共部分提取到輔助器方法:

@Test 
public void shouldHandleCase1() { 
    handleCase(1); 
    assertTrue(...); 
} 

@Test 
public void shouldHandleCase2() { 
    handleCase(2); 
    assertFalse(...); 
} 
+0

謝謝你,我認爲這應該有所幫助。 – Kevindra

+0

謝謝,這正是我正在尋找的。它對我來說非常好。 :) – Kevindra

0

最近我開始zohhak項目。它讓你的寫作

@TestWith({ 
    "1, true", 
    "2, false" 
}) 
public void test(int value, boolean expectedResult) { 
    assertThat(...).isEqualTo(expectedResult); 
} 
相關問題