Application Events
自Spring Framework 5.3.3以来,TestContext框架提供了对在`ApplicationContext`中发布的application events进行记录的支持,以便可以在测试中针对这些事件执行断言。在单一测试执行过程中发布的所有事件都可以通过`ApplicationEvents`API获得,该API允许你将事件作为`java.util.Stream`进行处理。
Since Spring Framework 5.3.3, the TestContext framework provides support for recording
application events published in the
ApplicationContext
so that assertions can be performed against those events within
tests. All events published during the execution of a single test are made available via
the ApplicationEvents
API which allows you to process the events as a
java.util.Stream
.
要在测试中使用 ApplicationEvents
,请执行以下操作。
To use ApplicationEvents
in your tests, do the following.
-
Ensure that your test class is annotated or meta-annotated with
@RecordApplicationEvents
. -
Ensure that the
ApplicationEventsTestExecutionListener
is registered. Note, however, thatApplicationEventsTestExecutionListener
is registered by default and only needs to be manually registered if you have custom configuration via@TestExecutionListeners
that does not include the default listeners. -
Annotate a field of type
ApplicationEvents
with@Autowired
and use that instance ofApplicationEvents
in your test and lifecycle methods (such as@BeforeEach
and@AfterEach
methods in JUnit Jupiter).-
When using the SpringExtension for JUnit Jupiter, you may declare a method parameter of type
ApplicationEvents
in a test or lifecycle method as an alternative to an@Autowired
field in the test class.
-
以下测试类使用 JUnit Jupiter 和 AssertJ 的 `SpringExtension`来断言在 Spring 管理的组件中调用方法时发布的应用程序事件的类型:
The following test class uses the SpringExtension
for JUnit Jupiter and
AssertJ to assert the types of application events
published while invoking a method in a Spring-managed component:
- 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 | Annotate the test class with @RecordApplicationEvents . |
2 | Inject the ApplicationEvents instance for the current test. |
3 | Use the ApplicationEvents API to count how many OrderSubmitted events were published.
|
4 | Annotate the test class with @RecordApplicationEvents . |
5 | Inject the ApplicationEvents instance for the current test. |
6 | Use the ApplicationEvents API to count how many OrderSubmitted events were published. |
另请参阅https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/event/ApplicationEvents.html[ApplicationEvents`javadoc],以了解有关 `ApplicationEvents
API 的更多详细信息。
See the
ApplicationEvents
javadoc for further details regarding the ApplicationEvents
API.