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

継承を使用すると、これに近いものを実現できます。これには、テスト出力でテストケースを区別できるという利点もあります。静力学と継承はあまりうまく連携しないので、少し遊んでみる必要があります。

1つのオプションは、10個のサブクラスを作成することです。各サブクラスには、スーパークラス@Beforeのインスタンスobjフィールドを初期化するメソッドがあります。TestObject毎回再初期化するオーバーヘッドが必要ない場合は@BeforeClass、シングルトン静的classObjフィールドを初期化するメソッドを使用することもできます。次に@Before、にコピーclassObjobjます。いずれにせよ、スーパークラスにはテストメソッドとobjインスタンスメソッドがありますが、初期化コードはありません。

于 2012-05-22T12:00:39.740 に答える