Application Events

自Spring Framework 5.3.3以来,TestContext框架提供了对在`ApplicationContext`中发布的application events进行记录的支持,以便可以在测试中针对这些事件执行断言。在单一测试执行过程中发布的所有事件都可以通过`ApplicationEvents`API获得,该API允许你将事件作为`java.util.Stream`进行处理。

要在测试中使用 ApplicationEvents,请执行以下操作。

  • 确保您的测试类被通过 @RecordApplicationEvents 注释或者元注释。

  • 确保 ApplicationEventsTestExecutionListener 已经注册。但是请注意,ApplicationEventsTestExecutionListener 默认注册,只在通过 @TestExecutionListeners 进行自定义配置时才需要手动注册,而该配置不包括默认侦听器。

  • 使用 @Autowired 注释一个类型为 ApplicationEvents 的字段,并在您的测试和生命周期方法(例如,JUnit Jupiter 中的 @BeforeEach@AfterEach 方法)中使用该 ApplicationEvents 实例。

    • 使用 SpringExtension for JUnit Jupiter 时,您可以在测试或生命周期方法中声明类型为 ApplicationEvents 的方法参数,作为测试类中 @Autowired 字段的替代方法。

以下测试类使用 JUnit Jupiter 和 AssertJ 的 `SpringExtension`来断言在 Spring 管理的组件中调用方法时发布的应用程序事件的类型:

Java
@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 事件。
Kotlin
@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)
	}
}
4 使用 @RecordApplicationEvents 注释测试类。
5 注入当前测试的 ApplicationEvents 实例。
6 使用 ApplicationEvents API 来计数已发布的 OrderSubmitted 事件。

另请参阅https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/event/ApplicationEvents.html[ApplicationEvents`javadoc],以了解有关 `ApplicationEvents API 的更多详细信息。