2012-05-22 112 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实例方法,但没有初始化代码。

相关问题