実験的機能っぽいけど、JUnit5でもParameterized Testsができるみたいなので、お試ししてみたよ。
必要なライブラリを追加
junit-jupiter-apiとParameterized Testをするために必要なjunit-jupiter-paramsを追加してあげる。
testCompile 'org.junit.jupiter:junit-jupiter-api:5.0.0' testCompile 'org.junit.jupiter:junit-jupiter-params:5.0.0'
テストコードを書いてみる
ドキュメントを参考に書いてみた。
Testアノテーションは不要で、ParameterizedTestアノテーションを設定してあげるみたい。
テストデータはValueSourceアノテーションに設定する。ValueSourceアノテーションでは一部の型だけが使えるっぽい。
データはメソッドの引数で受け取ってあげると。
@ParameterizedTest @ValueSource(strings = {"1", "2"}) void sample(final String value) { assertEquals(1, value.length()); }
ValueSourceで指定できないデータの場合
MethodSourceを使うパターン
MethodSourceアノテーションで指定した名前のstaticなメソッドを作り、そこでデータを作ってコレクションで返してあげる感じみたいです。
companion object { @JvmStatic fun data() = listOf( arrayOf("hoge", 4), arrayOf("1", 1) ) } @ParameterizedTest @MethodSource("data") fun sample2(input: String, expected: Int) { assertEquals(expected, input.length) }
Kotlinだけどちゃんと動いてていい感じです。
ArgumentsSourceを使うパターン
ArgumentsSourceアノテーションで指定したクラス(ArgumentsProviderの実装クラス)でパラメータを生成してあげます。
@ParameterizedTest @ArgumentsSource(MyArgumentsProvider::class) fun sample3(value: Pair<String, Int>) { assertEquals(value.second, value.first.length) } // このクラスでパラメータを生成する。 // この例だと、2つのパラメータをが作られます。 class MyArgumentsProvider : ArgumentsProvider { override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> = Stream.of(Pair("hoge", 4), Pair("abcdefg", 7)) .map { Arguments.of(it) } }
ちゃんと2回実行されてますね。
おわり。