JUnit4でParameterized.classを使ったテスト

1つのテストコードを、何種類かのパラメータで試験したい場合がある。
例えば、今まではテスト対象メソッドを呼び出す際の引数とか期待値が違うだけで、
テストメソッドをコピペして作成していたけど、これを使うとそんな必要がなくなる。


コードはこんな感じ。


@RunWith(Parameterized.class)
public class ParameterizedTest {
@Parameters
public static Collection data() {
List params = new ArrayList();
params.add(new Object[]{1, 1});
params.add(new Object[]{5, 25});
params.add(new Object[]{10, 100});
return params;
}

private int param;
private int expected;

public ParameterizedTest(int param, int expected) {
this.param = param;
this.expected = expected;
}

@Test
public void test() {
int result = param * param;
assertEquals(expected, result);
}

}
これを実行すると、@Parametersで指定したパラメータ分
@Testのメソッドが実行されるようになる。
このコードの場合は、testメソッドが3回実行される。


ポイントとしては

  • @RunWith(Parameterized.class)を指定する。
  • @Parametersを指定してCollectionを返却するstaticメソッドを作成する。
  • @Parametersのメソッドで、パラメータのObject配列のCollectionを返却するようにする。
  • コンストラクタでパラメータを受け取る。

といった感じ。


デメリットは、テストが失敗した際にどのパラメータで失敗したかが少しだけわかりにくくなるのと、
決まったパターン以外のテストは別のクラスに書かなきゃいけないこと。
(別にこのクラスに書いても大丈夫だけど、無駄にパラメータ数分実行される)




あと、@BeforeClassと@AfterClassのメソッドがあった場合、
ちゃんと1回しか実行されないようになっているみたいです。