状況
JUnit5
のParameterizedTest
で、MethodSource
が空Stream
を返した場合、以下のようなエラーになります。
Configuration error: You must configure at least one set of arguments for this @ParameterizedTest
org.junit.platform.commons.PreconditionViolationException: Configuration error: You must configure at least one set of arguments for this @ParameterizedTest
このエラーは、例えば「Abstract Class
にテストを定義し、各実装でMethodSource
を実装する」ような形でテストを実装している場合問題になります。
対処法
この問題は、EnabledIf
/DisabledIf
アノテーションを用い、テストを実行しないパターンを設定することで回避できます。
例えば以下のようになります(サンプルコードはKotlin
ですがJava
でも殆ど同じになります)。
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
abstract class Foo {
abstract fun provider(): Stream<Arguments>
private fun providerReturnsEmpty(): Boolean = provider().count() == 0L
@ParameterizedTest
@MethodSource("successProvider")
@DisabledIf(value = "providerReturnsEmpty", disabledReason = "providerが空を返すため")
fun test() { }
}
補足
EnabledIf/DisabledIfはどれ位何ができるか
EnabledIf
/DisabledIf
の詳しい使い方については以下のドキュメントで紹介されています。
junit.org
また、当該のドキュメントには出てきませんが、Spring
と組み合わせている場合SpEL
という記法で書くこともできます。
www.baeldung.com
ただ、個人的には、サンプルで紹介したようにboolean
を返す引数無し関数を定義するやり方をおすすめします。
理由は以下の通りです。
- 読み書きに知識が必要になって面倒
- アノテーション内で複雑なことをやり始めると(特に
Java
では)読みにくくなる
ParameterizedTestの方にオプションは無いのか
「ParameterizedTest
の方で空Stream
をエラーにしないオプションは無いのか」と思われるかもしれませんが、それは提供されていないようでした。
詳しくは下記のissue
にてやり取りが有ります(このオプションが欲しい方は👍を残すなりお願いします、自分は残しました)。
github.com