しおしお

IntelliJのあれやこれや

JUnit5のParameterized Testを試してみる

実験的機能っぽいけど、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());
}

IntelliJ IDEA(2017.3系)で実行

実行できた!IntelliJさんParameterizedTestに対応していい感じに表示してくれてすげー
f:id:sioiri:20170914200518p:plain

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だけどちゃんと動いてていい感じです。
f:id:sioiri:20170914202239p:plain

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回実行されてますね。
f:id:sioiri:20170915214102p:plain
おわり。