2012-05-22 78 views
2

我有一個看起來像這樣的測試案例:運行測試用例多次與不同@BeforeClass設置JUnit 4中

public class MyTest { 

    private static TestObject obj; 

    @BeforeClass 
    public static void setUpBeforeClass() { 
     obj = new TestObject(); 
    } 

    @Test 
    public void testOne() { 
     assertTrue(obj.hasFoo()); 
    } 

    @Test 
    public void testTwo() { 
     assertEquals(42, obj.getBar()); 
    } 

    // More tests here... 

} 

我想現在要做的是運行全部測試用例的不同實例什麼的TestObject。假設我有10個不同的TestObject實例。現在我想運行testOne()testTwo()等10次(使用我需要的每個TestObject實例)。

如何用JUnit4實現這一點?或者我的設計不好?任何更好的想法?

回答

4

使用parameterized test

@RunWith(Parameterized.class) 
public class MyTest { 
    public MyTest(TestObject obj) { 
     this.obj = obj; 
    } 

    @Parameters 
    public static Collection<TestObject> params() { ... } 

    ... 
} 
+0

太棒了!謝謝! – tyrondis

0

如何使用數組來測試一切?

public class MyTest { 

    private static TestObject[] objs; 

    @BeforeClass 
    public static void setUpBeforeClass() { 
     objs = new TestObj[]{new TestObject1(), new TestObject2()]; 
    } 

    @Test 
    public void testOne() { 
     for(TestObject obj : objs){ 
        assertTrue(obj.hasFoo()); 
     } 
    } 

    @Test 
    public void testTwo() { 
     for(TestObject obj : objs) { 
        assertEquals(42, obj.getBar()); 
     } 
    } 

    // More tests here... 

} 
0

你可以實現的東西接近這個與繼承,這也不得不讓你區分測試用例的測試輸出的優勢。你必須稍微玩一下,因爲靜態和繼承不能很好地結合在一起。

一個選項是創建10個子類,每個子類都有一個@Before方法,它在超類中初始化一個實例obj字段。如果您不希望每次重新初始化TestObject的開銷,您也可以使用@BeforeClass方法來初始化單個靜態classObj字段。您的@Before然後將classObj複製到obj。無論哪種方式,您的超類都有測試方法和obj實例方法,但沒有初始化代碼。

相關問題