アプリケーションイベント

Spring Framework 5.3.3 以降、TestContext フレームワークは、ApplicationContext で公開されたアプリケーションイベントの記録をサポートしているため、テスト内でこれらのイベントに対してアサーションを実行できます。単一のテストの実行中に公開されたすべてのイベントは、ApplicationEvents API を介して利用可能になります。これにより、イベントを java.util.Stream として処理できます。

テストで ApplicationEvents を使用するには、次のようにします。

  • テストクラスに @RecordApplicationEvents アノテーションが付けられているかメタアノテーションが付けられていることを確認してください。

  • ApplicationEventsTestExecutionListener が登録されていることを確認してください。ただし、ApplicationEventsTestExecutionListener はデフォルトで登録されており、デフォルトのリスナーを含まない @TestExecutionListeners を介したカスタム構成がある場合にのみ、手動で登録する必要があることに注意してください。

  • 型 ApplicationEvents のフィールドに @Autowired アノテーションを付け、その ApplicationEvents のインスタンスをテストメソッドとライフサイクルメソッド(JUnit Jupiter の @BeforeEach メソッドや @AfterEach メソッドなど)で使用します。

    • JUnit Jupiter 用 SpringExtension を使用する場合、テストクラスの @Autowired フィールドの代わりに、テストまたはライフサイクルメソッドで型 ApplicationEvents のメソッドパラメーターを宣言できます。

次のテストクラスは、JUnit Jupiter の SpringExtension と AssertJ (英語) を使用して、Spring 管理コンポーネントのメソッドの呼び出し中に公開されたアプリケーションイベントの型をアサートします。

  • Java

  • Kotlin

@SpringJUnitConfig(/* ... */)
@RecordApplicationEvents (1)
class OrderServiceTests {

	@Autowired
	OrderService orderService;

	@Autowired
	ApplicationEvents events; (2)

	@Test
	void submitOrder() {
		// Invoke method in OrderService that publishes an event
		orderService.submitOrder(new Order(/* ... */));
		// Verify that an OrderSubmitted event was published
		long numEvents = events.stream(OrderSubmitted.class).count(); (3)
		assertThat(numEvents).isEqualTo(1);
	}
}
1 テストクラスに @RecordApplicationEvents アノテーションを付けます。
2 現在のテストに ApplicationEvents インスタンスを注入します。
3ApplicationEvents API を使用して、公開された OrderSubmitted イベントの数をカウントします。
@SpringJUnitConfig(/* ... */)
@RecordApplicationEvents (1)
class OrderServiceTests {

	@Autowired
	lateinit var orderService: OrderService

	@Autowired
	lateinit var events: ApplicationEvents (2)

	@Test
	fun submitOrder() {
		// Invoke method in OrderService that publishes an event
		orderService.submitOrder(Order(/* ... */))
		// Verify that an OrderSubmitted event was published
		val numEvents = events.stream(OrderSubmitted::class).count() (3)
		assertThat(numEvents).isEqualTo(1)
	}
}
1 テストクラスに @RecordApplicationEvents アノテーションを付けます。
2 現在のテストに ApplicationEvents インスタンスを注入します。
3ApplicationEvents API を使用して、公開された OrderSubmitted イベントの数をカウントします。

ApplicationEvents API の詳細については、ApplicationEvents javadoc を参照してください。