在JUnit 4中使用不同的@BeforeClass设置多次运行测试用例

时间:2012-05-22 11:46:53

标签: java junit junit4

我有一个看起来像这样的测试用例:

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实现这一目标?还是我的设计不好?有没有更好的想法?

3 个答案:

答案 0 :(得分:4)

使用parameterized test

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

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

    ...
}

答案 1 :(得分: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...

}

答案 2 :(得分:0)

您可以通过继承实现与此接近的功能,这也可以让您区分测试输出中的测试用例。你必须要玩一点,因为静态和继承不能很好地协同工作。

一个选项是创建十个子类,每个子类都使用@Before方法初始化超类中的实例obj字段。如果您不希望每次重新初始化TestObject的开销,您还可以使用@BeforeClass方法初始化单个静态classObj字段。然后,您的@Before会将classObj复制到obj。无论哪种方式,您的超类都有测试方法和obj实例方法,但没有初始化代码。