BullよりElk

洋服と食をこよなく愛するWebプログラマ。

JUnit5試したみた #2

前回に引き続き、JUnit5について書きます。今回は、RepeatedTestについてです。

RepeatedTest

指定した回数@RepeatedTestを付与したテストメソッドを実行してくれます。具体的に言うと、@RepeatedTestのvalue属性に実行したい回数を指定します。

サンプルコード

実行結果

f:id:b1a9id:20171230113258p:plain

解説

BeforeEachは、各テストの各繰り返し回数ごとに実行される

以下の結果から見出しのことが言えます。

表示名がカスタマイズできる

RepeatedTestでは、先に説明したことに加えて、繰り返し回数ごとに表示名(displayName)をカスタマイズすることができます。デフォルトの表示名は、RepeatedTest.SHORT_DISPLAY_NAMEである、「repetition [現在の実行回数] of [実行すべき回数]」です。
静的なテキストと動的なプレースホルダーから成り立つメッセージを、@RepeatedTestのname属性に指定します。
用意されているプレースホルダーは、次の3つになります。

{displayName} @RepeatedTestメソッドのdisplayName
{currentRepetition} 現在の実行回数
{totalRepetitions} 実行すべき回数

繰り返し回数ごとに表示名を変更しているテストが、customDisplayName()メソッドとcustomDisplayNameLongPattern()メソッドになります。
後者のテストでは、name属性にRepeatedTest.LONG_DISPLAY_NAMEを指定しています。実際に表示されるメッセージは、「Details... :: repetition [現在の実行回数] of [実行すべき回数]」です。

ここで、現在の実行回数や実行すべき回数ってどう取得すればいいの?って疑問がでてくると思います。
RepetitionInfoインターフェースをインジェクトすることで解決できます。
これは、getCurrentRepetition()メソッドとgetTotalRepetitions()メソッドを持ったインターフェースで、@RepeatedTest、@BeforeEach、@AfterEachが付与されたメソッドにのみインジェクトすることができます。
@RepeatedTestが付与されたメソッドが存在しないクラスで、@BeforeEachまたは@AfterEachが付与されたメソッドにRepetitionInfoをインジェクトしようとすると、ParameterResolutionExceptionがスローされます。
customDisplayName()メソッドを見てもらえば、使い方がわかると思います。

次回は、ParameterizedTestについて書きます。