テスト実行イベント

Spring Framework 5.2 で導入された EventPublishingTestExecutionListener は、カスタム TestExecutionListener を実装するための代替アプローチを提供します。テストの ApplicationContext のコンポーネントは、EventPublishingTestExecutionListener によって発行された次のイベントをリッスンできます。各イベントは、TestExecutionListener API のメソッドに対応しています。

  • BeforeTestClassEvent

  • PrepareTestInstanceEvent

  • BeforeTestMethodEvent

  • BeforeTestExecutionEvent

  • AfterTestExecutionEvent

  • AfterTestMethodEvent

  • AfterTestClassEvent

これらのイベントは、モック Bean のリセットやテスト実行のトレースなど、さまざまな理由で消費される場合があります。カスタム TestExecutionListener を実装するのではなく、テスト実行イベントを消費する利点の 1 つは、テスト ApplicationContext に登録された Spring Bean がテスト実行イベントを消費できること、およびそのような Bean が依存性注入および ApplicationContext の他の機能から直接恩恵を受ける可能性があることです。対照的に、TestExecutionListener は ApplicationContext の Bean ではありません。

EventPublishingTestExecutionListener はデフォルトで登録されています。ただし、ApplicationContext がすでにロードされている場合にのみイベントを公開します。これにより、ApplicationContext が不必要にロードされたり早すぎたりするのを防ぎます。

BeforeTestClassEvent は、ApplicationContext が別の TestExecutionListener によってロードされるまで公開されません。例: TestExecutionListener 実装のデフォルトのセットが登録されている場合、特定のテスト ApplicationContext を使用する最初のテストクラスに対して BeforeTestClassEvent 公開されませんが、同じテストを使用する同じテストスイート内の後続のテストクラスに対して BeforeTestClassEvent が公開されます。ApplicationContext は、後続のテストクラスの実行時にコンテキストがすでにロードされているためです(コンテキストが @DirtiesContext または最大サイズのエビクションポリシーを介して ContextCache から削除されていない場合)。

BeforeTestClassEvent がすべてのテストクラスに対して常に公開されるようにする場合は、ApplicationContext を beforeTestClass コールバックにロードする TestExecutionListener を登録する必要があり、TestExecutionListener は EventPublishingTestExecutionListenerに登録する必要があります。

同様に、@DirtiesContext を使用して特定のテストクラスの最後のテストメソッドの後にコンテキストキャッシュから ApplicationContext を削除した場合、AfterTestClassEvent はそのテストクラスに対して公開されません。

テスト実行イベントをリッスンするために、Spring Bean は org.springframework.context.ApplicationListener インターフェースの実装を選択できます。または、リスナーメソッドに @EventListener アノテーションを付けて、上記の特定のイベント型の 1 つをリッスンするように構成できます(アノテーションベースのイベントリスナーを参照)。このアプローチの人気により、Spring は次の専用 @EventListener アノテーションを提供して、テスト実行イベントリスナーの登録を簡素化します。これらのアノテーションは、org.springframework.test.context.event.annotation パッケージにあります。

  • @BeforeTestClass

  • @PrepareTestInstance

  • @BeforeTestMethod

  • @BeforeTestExecution

  • @AfterTestExecution

  • @AfterTestMethod

  • @AfterTestClass

例外処理

デフォルトでは、テスト実行イベントリスナーがイベントの消費中に例外をスローすると、その例外は使用中の基礎となるテストフレームワーク(JUnit や TestNG など)に伝播します。例: BeforeTestMethodEvent の消費により例外が発生した場合、対応するテストメソッドは例外の結果として失敗します。対照的に、非同期のテスト実行イベントリスナーが例外をスローする場合、例外は基礎となるテストフレームワークに伝播しません。非同期例外処理の詳細については、@EventListener のクラスレベルの javadoc を参照してください。

非同期リスナー

特定のテスト実行イベントリスナーでイベントを非同期的に処理する場合は、Spring の通常の @Async サポートを使用できます。詳細については、@EventListener のクラスレベルの Javadoc を参照してください。