アプリケーションイベント
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 を参照してください。