测试执行事件

EventPublishingTestExecutionListener 提供了一种实现自定义 TestExecutionListener 的替代方法。 测试的 ApplicationContext 中的组件可以监听 EventPublishingTestExecutionListener 发布的以下事件, 每个事件都对应于 TestExecutionListener API 中的一个方法。

  • BeforeTestClassEvent

  • PrepareTestInstanceEvent

  • BeforeTestMethodEvent

  • BeforeTestExecutionEvent

  • AfterTestExecutionEvent

  • AfterTestMethodEvent

  • AfterTestClassEvent

这些事件可以出于各种原因被消费,例如重置模拟 bean 或跟踪测试执行。 消费测试执行事件而不是实现自定义 TestExecutionListener 的一个优点是, 测试执行事件可以被注册在测试 ApplicationContext 中的任何 Spring bean 消费, 并且这些 bean 可以直接从依赖注入和 ApplicationContext 的其他特性中受益。 相比之下,TestExecutionListener 不是 ApplicationContext 中的 bean。

EventPublishingTestExecutionListener 默认已注册;但是,它只在 ApplicationContext 已经加载 的情况下发布事件。这可以防止 ApplicationContext 不必要地或过早地加载。 因此,BeforeTestClassEvent 直到 ApplicationContext 被另一个 TestExecutionListener 加载后才会被发布。例如,在注册默认的 TestExecutionListener 实现集的情况下, BeforeTestClassEvent 不会为使用特定测试 ApplicationContext 的第一个测试类发布, 但对于同一测试套件中后续使用相同测试 ApplicationContext 的任何测试类, BeforeTestClassEvent 被发布,因为当后续测试类运行时,上下文将已经加载 (只要上下文未通过 @DirtiesContext 或最大大小驱逐策略从 ContextCache 中移除)。 如果您希望确保 BeforeTestClassEvent 始终为每个测试类发布,则需要注册一个 在 beforeTestClass 回调中加载 ApplicationContextTestExecutionListener, 并且该 TestExecutionListener 必须在 EventPublishingTestExecutionListener 之前 注册。 同样,如果 @DirtiesContext 用于在给定测试类中的最后一个测试方法之后从上下文缓存中移除 ApplicationContext,则 AfterTestClassEvent 将不会为该测试类发布。

为了监听测试执行事件,Spring bean 可以选择实现 org.springframework.context.ApplicationListener 接口。 或者,监听器方法可以用 @EventListener 注解,并配置为监听上面列出的特定事件类型之一 (参见 基于注解的事件监听器)。 由于这种方法的普及,Spring 提供了以下专用的 @EventListener 注解来简化测试执行事件监听器的注册。 这些注解位于 org.springframework.test.context.event.annotation 包中。

  • @BeforeTestClass

  • @PrepareTestInstance

  • @BeforeTestMethod

  • @BeforeTestExecution

  • @AfterTestExecution

  • @AfterTestMethod

  • @AfterTestClass

异常处理

默认情况下,如果测试执行事件监听器在消费事件时抛出异常,该异常将传播到正在使用的底层测试框架 (例如 JUnit 或 TestNG)。例如,如果消费 BeforeTestMethodEvent 导致异常, 则相应的测试方法将因该异常而失败。相反,如果异步测试执行事件监听器抛出异常, 则该异常不会传播到底层测试框架。有关异步异常处理的更多详细信息, 请查阅 @EventListener 的类级别 javadoc。

异步监听器

如果您希望特定的测试执行事件监听器异步处理事件,您可以使用 Spring 的 常规 @Async 支持。 有关更多详细信息,请查阅 @EventListener 的类级别 javadoc。