技術開発日記

技術やら日々思ったことを綴ってます。

Junitのパラメータテスト

Enclosed.classとは別にRunWithアノテーションにTheories.classを追加すると複数パラメータのテストでありがちなコピペを減らすことができるみたい。

具体的にはパラメータのパターンで使いたい変数に@DataPointを付与し、テストメソッドに@Theoryを付与すれば、あとは自動的にパラメータの組み合わせ分テストが実施されるといった仕組みになっている。

以下は簡単なサンプルです。
※Stringの変数を2つ書いていますが、Stringの配列でもOKです。

    @RunWith(Theories.class)
    public static class CalcTest {

        @DataPoint
        public static String PARAM_1 = "TOKYO";

        @DataPoint
        public static String PARAM_2 = "OKINAWA";

        @Theory
        public void test(String city1, String city2) {
            System.out.println("city1: " + city1 +  " city2: " + city2);
        }
    }

実施結果
city1: TOKYO city2: TOKYO
city1: TOKYO city2: OKINAWA
city1: OKINAWA city2: TOKYO
city1: OKINAWA city2: OKINAWA


ただ、これだとテスト結果を比較するのが困難かつコピペ作業が発生してしまうため、実際にはテストメソッドに渡すパラメータをクラスとして定義してしまい、そのクラスにパターンと期待値を保持するようにする。

以下は簡単なサンプルです。

    // テスト対象のクラス
    class Print {

        // 文字列を結合して返却
        public String combine(String st1, String st2) {
            return st1 + " : " + st2;
        }
    }

    @RunWith(Theories.class)
    public static class CalcTest {

        @DataPoint
        public static Parameter PARAM_1 = new Parameter("TOKYO", "OKINAWA", "TOKYO : OKINAWA");
        
        @DataPoint
        public static Parameter PARAM_2 = new Parameter("NEWYORK", "TEXAS", "NEWYORK : TEXAS");

        // パターンと期待値を保持する内部クラス
        static class Parameter {
            String city1;
            String city2;
            String expected;

            Parameter(String city1, String city2, String expected) {
                this.city1 = city1;
                this.city2 = city2;
                this.expected = expected;
            }
        }

        @Theory
        public void test(Parameter parameter) {
            Print print = new Print();
            String actual = print.combine(parameter.city1, parameter.city2);
            assertThat(actual, is(parameter.expected));
        }
    }