JUnit4 Decorator から Strategy? Parameterized

ひっそりと backport175 で JUnit4 を backport していたりするのですが,最近になって org.junit.runner.Parameterized なんてものが追加されたりしたようです.


この Parameterized はテストクラスを様々な値でテストしたい場合の手間を軽減するものみたいです.
そんな場合,従来だと Decorator なんかが使われていたかと思うのですが,むしろ Strategy を使うのが JUnit4 流っぽいのかも.
そしてテストクラスがどの Strategy を使うかを指定するために @Factory アノテーションが追加されました.
こんな感じ.

	@Factory(Parameterized.class) static public class FibonacciTest {

backport175 版だと

	/**
	 * @org.junit.Factory(org.junit.runner.Parameterized.class)
	 */
	static public class FibonacciTest {

そうすると Parameterized Strategy はテストデータを提供するメソッドとして @Parameters というアノテーションの付けられたメソッドを探します.

		@Parameters public static Object[] data() {
			return new int[][] {{0, 0}, {1, 1}, {2, 1}, {3, 2}, {4, 3}, {5, 5}, {6, 8}};
		}

backport175 版だと

		/**
		 * @org.junit.Parameters
		 */
		public static Object[] data() {
			return new int[][] {{0, 0}, {1, 1}, {2, 1}, {3, 2}, {4, 3}, {5, 5}, {6, 8}};
		}

そうすると Parameterized はこのメソッドが返す配列の要素数分,テストクラスをインスタンス化して実行してくれるようです.この例だと上記メソッドは要素数 7 の配列を返すので,テストは 7 回実行されることになります.
ちなみにテストクラスはコンストラクタを一つだけ持っていること,その引数の数は上記メソッドが返す配列の要素の配列の要素の数 (上の例だと配列の要素は要素を二つ持つ配列なので 2) と一致している必要があるようです.テストクラスはそれをコンストラクタ引数としてインスタンス化されるわけですが,この辺はまだ流動的っぽい.


今のところ,@Factory で指定できる RunnerStrategy の実装クラスとして有用そうなものは Parameterized くらいしか見当たらないのですが,従来の Decorator に代わるものとしていろいろ用意されるかもしれませんね.
詳しくはいずれ t-wada さんが解説してくれるでしょう (笑).