测试执行事件

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不必要地或过早地加载。

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

如果您希望确保为每个测试类始终发布BeforeTestClassEvent,则需要注册一个TestExecutionListener,该监听器在beforeTestClass回调中加载ApplicationContext,并且该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。