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)); } }