对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

测试执行事件

Spring Framework 5.2 引入的 EventPublishingTestExecutionListener 提供了一种实现自定义 TestExecutionListener 的替代方法。测试的 ApplicationContext 中的组件可以监听由 EventPublishingTestExecutionListener 发布的以下事件,每个事件分别对应于 TestExecutionListener API 中的一个方法。spring-doc.cadn.net.cn

这些事件可能会出于各种原因被消费,例如重置模拟(mock)Bean 或跟踪测试执行过程。与实现自定义的 TestExecutionListener 相比,消费测试执行事件的一个优势在于:任何注册在测试 ApplicationContext 中的 Spring Bean 都可以消费这些事件,并且这些 Bean 能够直接受益于依赖注入和 ApplicationContext 提供的其他特性。相比之下,TestExecutionListener 并不是 ApplicationContext 中的一个 Bean。spring-doc.cadn.net.cn

EventPublishingTestExecutionListener 默认已注册;但是,它仅在 ApplicationContext 已被加载 的情况下才会发布事件。这可以防止 ApplicationContext 被不必要地或过早地加载。spring-doc.cadn.net.cn

因此,在另一个 TestExecutionListener 加载了 ApplicationContext 之前,不会发布 BeforeTestClassEvent。例如,使用默认注册的 TestExecutionListener 实现集时,对于第一个使用特定测试 ApplicationContext 的测试类,不会发布 BeforeTestClassEvent;但对于同一测试套件中后续使用该相同测试 ApplicationContext 的任何测试类,发布 BeforeTestClassEvent,因为当后续测试类运行时,上下文已经加载(只要该上下文尚未通过 @DirtiesContext 或最大大小驱逐策略从 ContextCache 中移除)。spring-doc.cadn.net.cn

如果你希望确保为每个测试类始终发布一个 BeforeTestClassEvent, 你需要注册一个 TestExecutionListener,该监听器在 ApplicationContext 回调中加载 beforeTestClass, 并且该 TestExecutionListener 必须在 EventPublishingTestExecutionListener 之前 注册。spring-doc.cadn.net.cn

同样地,如果在给定测试类的最后一个测试方法之后使用 @DirtiesContext 从上下文缓存中移除 ApplicationContext,则不会为该测试类发布 AfterTestClassEventspring-doc.cadn.net.cn

为了监听测试执行事件,Spring Bean 可以选择实现 org.springframework.context.ApplicationListener 接口。或者,也可以使用 @EventListener 注解标注监听方法,并配置为监听上述列出的特定事件类型之一(参见 基于注解的事件监听器)。 由于这种方法非常流行,Spring 提供了以下专用的 @EventListener 注解,以简化测试执行事件监听器的注册。 这些注解位于 org.springframework.test.context.event.annotation 包中。spring-doc.cadn.net.cn

异常处理

默认情况下,如果测试执行事件监听器在消费事件时抛出异常,该异常将传播到所使用的底层测试框架(例如 JUnit 或 TestNG)。例如,如果消费 BeforeTestMethodEvent 时发生异常,则相应的测试方法会因该异常而失败。相比之下,如果异步测试执行事件监听器抛出异常,则该异常不会传播到底层测试框架。有关异步异常处理的更多详细信息,请参阅 @EventListener 注解的类级别 JavaDoc。spring-doc.cadn.net.cn

异步监听器

如果您希望特定的测试执行事件监听器异步处理事件, 可以使用 Spring 的常规@Async支持。 有关更多详情,请参阅@EventListener的类级别 Javadoc。spring-doc.cadn.net.cn