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

  • BeforeTestClassEvent
  • PrepareTestInstanceEvent
  • BeforeTestMethodEvent
  • BeforeTestExecutionEvent
  • AfterTestExecutionEvent
  • AfterTestMethodEvent
  • AfterTestClassEvent

:::info 这些事件只有在 ApplicationContext 已经被加载时才会被发布。 :::

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

为了监听测试执行事件,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。