web-dev-qa-db-ja.com

配列をループし、各要素はJUnitテスト

テストデータの配列をループするJUnit4テストがあります。

public @Test void testAll() {

    final Object[][] sets = new Object[][] {
            // SET                              TYPE VALUE

            // --- valid sets

            // groups
            x(s(A,1, B,1, C,1),                 G),
            x(s(A,4, B,4, D,4),                 G),
            x(s(A,8, B,8, D,8, C,8),            G),
            x(s(J,J, B,4, D,4),                 G,  4*3),
            x(s(A,9, J,J, D,9),                 G,  9*3),
            x(s(A,2, B,2, C,2),                 G),
            x(s(A,4, B,4, J,J),                 G,  4*3),
            x(s(A,4, B,4, C,4, D,4),            G),

            // runs
            x(s(A,1, A,2, A,3),                 R),
            x(s(B,8, B,9, B,10),                R),
            x(s(J,J, C,2, C,3),                 R,  6),
            x(s(D,8, D,9, J,J, D,11),           R,  38),
            x(s(D,8, D,9, J,J, J,J),            R,  38),

            // sames
            x(s(A,1, A,1),                      S),
            x(s(B,4, B,4, B,4),                 S),
            x(s(C,8, C,8),                      S),
            x(s(D,3, D,3),                      S),

            // doubt-cases, assume group (TODO: verify this is correct)
            x(s(J,J, J,J, D,4),                 G,  4*3),
            x(s(A,7, J,J, J,J),                 G,  7*3),
            x(s(J,J, D,9, J,J),                 G,  9*3),
            x(s(J,J, J,J, J,J),                 G,  1),

            // --- invalid sets
            x(s(B,1, A,2, A,3),                 I), // not same colour
            x(s(D,11, D,12, J,J, J,J),          I), // last joker is 14
            x(s(B,1, B,1, A,1),                 I), // duplicate B1
            x(s(A,1, A,2, A,3, A,5),            I), // gap A4
            x(s(J,J, A,1, J,J, B,1, C,1),       I), // one J replaces D1, then nothing left to replace
            x(s(A,1, A,2),                      I), // short
            x(s(B,1),                           I), // shorter
            x(s(A,5, A,6),                      I), // short
    };

    for (Object[] o : sets) {

        TileSet s = (TileSet) o[0];
        Type t = (Type) o[1];
        int v = (Integer) o[2];

        System.out.println(s);

        assertEquals(t, s.getType());
        assertEquals(v, s.getValue());

        // test isValid, though it's Too Simple To Break(R)
        if (t == Type.INVALID) assertFalse(s.isValid());
        else assertTrue(s.isValid());
    }

}

すべてが1つのテスト方法に含まれているため、配列内の1つの要素が失敗すると、テスト全体が停止します。各テスト項目のメソッドを作成せずに、それを回避する方法はありますか?多分反射のあるもの?

16

JUnit 4の パラメーター化されたテスト を使用します。ドキュメントはかなり不足していますが、これらはこのタイプの問題に完全に適合します。

それらの使用方法に関する他のいくつかのサンプルを次に示します。

22
matt b

AssertionErrorをキャッチし、キャッチしたエラーをエラーリストに追加します。最後に、リストが空であることを確認し、空でない場合は複合AssertionErrorを上げます。

4
khachik