3

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

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

3 回答 3

5

使用参数化测试

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

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

    ...
}
于 2012-05-22T11:57:43.470 回答
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...

}
于 2012-05-22T11:57:23.453 回答
0

您可以通过继承实现与此接近的目标,这还具有允许您区分测试输出中的测试用例的优势。您必须尝试一下,因为静态和继承不能很好地协同工作。

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

于 2012-05-22T12:00:39.740 回答