应用程序事件

TestContext 框架支持记录在ApplicationContext 中发布的应用程序事件,以便在测试中对这些事件执行断言。在单个测试执行期间发布的所有事件都可通过ApplicationEvents API 获得,该 API 允许您将事件作为java.util.Stream 进行处理。

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

  • 确保您的测试类使用@RecordApplicationEvents进行注解或元注解。

  • 确保注册了ApplicationEventsTestExecutionListener。但是,请注意,ApplicationEventsTestExecutionListener 默认情况下已注册,只有在您通过@TestExecutionListeners进行自定义配置且不包含默认监听器时,才需要手动注册。

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

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

以下测试类使用 JUnit Jupiter 的SpringExtensionAssertJ来断言在调用 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