2009-07-30 57 views
6

在參數化類中運行的junit測試類中,我可以使用多個@Parameters方法嗎?@ Junit 4中的參數

@RunWith(value = Parameterized.class) 
public class JunitTest6 { 

private String str; 

public JunitTest6(String region, String coverageKind, 
     String majorClass, Integer vehicleAge, BigDecimal factor) { 
    this.str = region; 
} 

    @Parameters 
public static Collection<Object[]> data1() { 
    Object[][] data = {{some data}} 

    return Arrays.asList(data); 
} 

@Test 
public void pushTest() { 
    System.out.println("Parameterized str is : " + str); 
    str = null; 
} 

@Parameters 
public static Collection<Object[]> data() { 
    Object[][] data = {{some other data}} 
    return Arrays.asList(data); 
} 

@Test 
public void pullTest() { 
    System.out.println("Parameterized new str is : " + str); 
    str = null; 
} 
} 

回答

2

您可以使用Theories跑步者(在該鏈接中搜索詞理論)將不同的參數傳遞給不同的方法。

+0

是的,這可能是解決方案,謝謝Yishai。 – ravinikam 2009-10-07 14:20:09

2

也許data1方法,卻沒有這樣的保證,它會使用哪一個JVM中首先對junit4。

下面是相關的代碼的JUnit:

private FrameworkMethod getParametersMethod(TestClass testClass) throws Exception { 
    List<FrameworkMethod> methods= testClass.getAnnotatedMethods(Parameters.class); 
    for (FrameworkMethod each : methods) { 
     int modifiers= each.getMethod().getModifiers(); 
      if (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers)) 
       return each; 
    } 

    throw new Exception("No public static parameters method on class " + testClass.getName()); 
} 

所以第一次公開,靜態註解的方法,它發現將被使用,但它可以以任何順序找到他們。

你爲什麼用這種方式寫你的測試?你應該只有一個@Parameters -annotated方法。

+0

謝謝skaffman。其實我想用不同的方法在相同的測試類中測試兩種不同的行爲有效和無效的行爲。 – ravinikam 2009-07-30 12:31:55

+0

好的。如果你很熱衷,那麼你可以編寫你自己的Test runner實現(複製Parameterized的源代碼並修改它以使你自己做到),但是內置的Parameterized runner是相當粗糙的。 – skaffman 2009-07-30 12:44:52

+0

嗯,謝謝反正。 – ravinikam 2009-07-30 12:53:01

2

它沒有被指定有多個數據方法。你可以在skaffman's answer中看到它。

爲什麼不提供實現兩種數據方法?
答案可能是:耦合。

把這個測試分成兩個測試用例太複雜了嗎?你將能夠引入一個小的繼承並共享通用的方法。有了兩個測試用例,你可以提供兩種分離的數據方法,並且可以很好地測試你的東西。

我希望它有幫助。

1

您可以爲每組操作相同參數的方法創建內部類。例如:

public class JunitTest6 { 

@RunWith(value = Parameterized.class) 
public static class PushTest{ 
    private String str; 
    public PushTest(String region) { 
    this.str = region; 
    } 

    @Parameters 
    public static Collection<Object[]> data() { 
    Object[][] data = {{some data}} 

    return Arrays.asList(data); 
    } 

    @Test 
    public void pushTest() { 
    System.out.println("Parameterized str is : " + str); 
    str = null; 
    } 
} 

@RunWith(value = Parameterized.class) 
public static class PullTest{ 
    private String str; 
    public PullTest(String region) { 
    this.str = region; 
    } 

    @Parameters 
    public static Collection<Object[]> data() { 
    Object[][] data = {{some other data}} 
    return Arrays.asList(data); 
    } 

    @Test 
    public void pullTest() { 
    System.out.println("Parameterized new str is : " + str); 
    str = null; 
    } 
} 
}