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 さんが解説してくれるでしょう (笑).