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 事件。
|
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 的更多详细信息。