状況
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の詳しい使い方については以下のドキュメントで紹介されています。
また、当該のドキュメントには出てきませんが、Springと組み合わせている場合SpELという記法で書くこともできます。
ただ、個人的には、サンプルで紹介したようにbooleanを返す引数無し関数を定義するやり方をおすすめします。
理由は以下の通りです。
- 読み書きに知識が必要になって面倒
- アノテーション内で複雑なことをやり始めると(特に
Javaでは)読みにくくなる
ParameterizedTestの方にオプションは無いのか
「ParameterizedTestの方で空Streamをエラーにしないオプションは無いのか」と思われるかもしれませんが、それは提供されていないようでした。
詳しくは下記のissueにてやり取りが有ります(このオプションが欲しい方は👍を残すなりお願いします、自分は残しました)。