【JUnit5】MethodSourceで空Streamをエラーにしたくない場合の対処

状況

JUnit5ParameterizedTestで、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