最新の安定バージョンについては、Spring Framework 7.0.0 を使用してください! |
アプリケーションイベント
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 インスタンスを注入します。 |
| 3 | ApplicationEvents 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 インスタンスを注入します。 |
| 3 | ApplicationEvents API を使用して、公開された OrderSubmitted イベントの数をカウントします。 |
ApplicationEvents API の詳細については、ApplicationEvents javadoc を参照してください。