前回に引き続き、JUnit5について書きます。2018年1月15日に5.0.3がリリースされましたね。今回は、ParameterizedTestについてです。
元のソースコードはGitHubにおいてあります。
github.com
ParameterizedTest
ParameterizedTestは、指定した引数を用いて、複数回テストを実行することができます。同じテストだけど、引数だけが違うというときに使えます!
引数のタイプを指定できるアノテーションは、以下の6つです。
@ValueSource、@EnumSource、@MethodSource、@CsvSource、@CsvFileSource、@ArgumentSource
詳しくは、後ほど説明します。
@ValueSource
@ValueSourceは、最もシンプルに引数のタイプを指定できます。
@ValueSourceで指定できる型は、String、int、long、doubleの配列です。配列の前から順番にテストします。
以下がStringの配列を指定したときの例です。int、long、doubleのときも同様です。
テスト対象クラス
テストクラス
実行結果
@EnumSource
@EnumSourceで指定できる属性は、value、names、modeがあります。配列の前から順番にテストします。
属性 | 説明 |
---|---|
value | Enumのタイプを指定する。 |
names | Valueで指定したEnumのタイプの特定の値をStringの配列で指定する(正規表現も使用可能)。これらの値をテストでどういう扱いにするかをmodeで指定する。 |
mode | EnumSource.Modeのどれか(EXCLUDE, INCLUDE, MATCH_ALL, MATCH_ANY)を指定する。 |
EnumSource.Modeの説明
値 | 説明 |
---|---|
EXCLUDE | namesで指定した値を除外して抽出する。 |
INCLUDE | namesで指定した値のみ抽出する。namesのデフォルトはこれです。 |
MATCH_ALL | namesで正規表現を指定した場合にすべてに当てはまる値のみ抽出する。 |
MATCH_ANY | namesで正規表現を指定した場合にどれかに当てはまる値のみ抽出する。 |
なお、namesを未指定でMATCH_ALLまたはMATCH_ANYを指定した場合は、すべての値を抽出します。
テスト対象のEnum
テストクラス
@CsvSource
@CsvSourceで指定できる型は、カンマ区切り文字列の配列です。配列の前から順番にテストします。
説明があまりうまくできていない気がするのでサンプルみてみましょうw
ちなみに指定の仕方は、JUnit 5 User Guideに詳しく書いてあるのでこちらを参照していただければと思います。
テストクラス
実行結果
@MethodSource
@MethodSourceは、自分で実装した指定したい型のSteramまたはIterableまたはIteratorまたは配列を返すメソッドをStringの配列で指定します。
メソッドの引数が1つのときの、テストクラス
methodSourceIntStreamメソッドの実行結果
methodSourceStreamメソッドの実行結果
メソッドの引数が2つのときの、テストクラス
実行結果
解説
メソッドで複数の引数を指定したい場合は、ArgumentインターフェースのCollectionかStreamを返す必要があります。
@ArgumentsSource
上で紹介したものは全てArgumentsProviderインターフェースを実装したクラスを呼んでいます。
つまり、再利用可能なArgumentsProviderを実装して、値を自由に指定しようということです。
テストクラス
実行結果