Spring 提供了以下已注册的实现
默认情况下,完全按以下顺序排列:TestExecutionListener
-
ServletTestExecutionListener
:为 .WebApplicationContext
-
DirtiesContextBeforeModesTestExecutionListener
:处理“之前”模式的注释。@DirtiesContext
-
ApplicationEventsTestExecutionListener
:提供对ApplicationEvents
的支持。 -
DependencyInjectionTestExecutionListener
:为测试提供依赖注入 实例。 -
MicrometerObservationRegistryTestExecutionListener
:提供支持 千分尺的.ObservationRegistry
-
DirtiesContextTestExecutionListener
:处理 “之后”模式。@DirtiesContext
-
TransactionalTestExecutionListener
:提供事务性测试执行 默认回滚语义。 -
SqlScriptsTestExecutionListener
:运行使用注解配置的 SQL 脚本。@Sql
-
EventPublishingTestExecutionListener
:将测试执行事件发布到测试(请参阅测试执行事件)。ApplicationContext
注册实现TestExecutionListener
您可以显式注册测试类的实现,其
子类及其嵌套类,使用注释。有关详细信息和示例,请参阅注释支持和 javadoc for @TestExecutionListeners
。TestExecutionListener
@TestExecutionListeners
切换到默认实现
TestExecutionListener 如果扩展了注释的类,并且需要
切换到使用默认的侦听器集,您可以使用
以后。
|
自动发现默认实现TestExecutionListener
使用以下方式注册实现
适用于在有限测试方案中使用的自定义侦听器。但是,它可以
如果需要在整个测试套件中使用自定义侦听器,则会变得很麻烦。这
该问题通过支持通过该机制自动发现默认实现得到解决。TestExecutionListener
@TestExecutionListeners
TestExecutionListener
SpringFactoriesLoader
例如,该模块在
其 META-INF/spring.factories
属性文件。第三方框架和开发人员可以将自己的实现贡献给同一
方式通过他们自己的文件。spring-test
TestExecutionListener
org.springframework.test.context.TestExecutionListener
TestExecutionListener
spring.factories
对实现进行排序TestExecutionListener
当 TestContext 框架发现默认实现时
通过上述机制,实例化的侦听器按
Spring's ,它尊重 Spring 的界面和排序注释。 以及 Spring 提供的所有默认实现
适当的值。因此,第三方框架和开发人员应确保
它们的默认实现按正确的顺序注册
通过实现或声明 .有关核心默认实现的方法,请参阅 javadoc,了解详细信息
值分配给每个核心侦听器。TestExecutionListener
SpringFactoriesLoader
AnnotationAwareOrderComparator
Ordered
@Order
AbstractTestExecutionListener
TestExecutionListener
Ordered
TestExecutionListener
Ordered
@Order
getOrder()
TestExecutionListener
合并实现TestExecutionListener
如果自定义是通过 注册的,
未注册默认侦听器。在最常见的测试场景中,这有效地
强制开发人员手动声明除任何自定义之外的所有默认侦听器
听众。以下列表演示了这种配置方式:TestExecutionListener
@TestExecutionListeners
-
Java
-
Kotlin
@ContextConfiguration
@TestExecutionListeners({
MyCustomTestExecutionListener.class,
ServletTestExecutionListener.class,
DirtiesContextBeforeModesTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
SqlScriptsTestExecutionListener.class
})
class MyTest {
// class body...
}
@ContextConfiguration
@TestExecutionListeners(
MyCustomTestExecutionListener::class,
ServletTestExecutionListener::class,
DirtiesContextBeforeModesTestExecutionListener::class,
DependencyInjectionTestExecutionListener::class,
DirtiesContextTestExecutionListener::class,
TransactionalTestExecutionListener::class,
SqlScriptsTestExecutionListener::class
)
class MyTest {
// class body...
}
这种方法的挑战在于,它要求开发人员确切地知道
默认情况下会注册哪些侦听器。此外,默认侦听器集可以
从一个版本到另一个版本的变化 - 例如,是
在 Spring Framework 4.1 中引入,并在 Spring Framework 4.2 中引入。此外,像 Spring 这样的第三方框架
Boot 和 Spring Security 使用上述自动发现机制注册自己的默认实现。SqlScriptsTestExecutionListener
DirtiesContextBeforeModesTestExecutionListener
TestExecutionListener
为了避免必须知道并重新声明所有默认侦听器,您可以将 的属性设置为 。 指示本地声明的侦听器应与
默认侦听器。合并算法可确保从
列表,并且根据语义对生成的合并侦听器集进行排序
的,如对 TestExecutionListener
实现进行排序中所述。
如果侦听器实现或被注释为 ,它可以影响
它与默认值合并的位置。否则,本地声明的侦听器
合并时将追加到默认侦听器列表中。mergeMode
@TestExecutionListeners
MergeMode.MERGE_WITH_DEFAULTS
MERGE_WITH_DEFAULTS
AnnotationAwareOrderComparator
Ordered
@Order
例如,如果上一个示例中的类
将其值(例如,)配置为小于 (恰好是 ) 的顺序,然后可以自动与
默认值在 前面,前面的例子可以
替换为以下内容:MyCustomTestExecutionListener
order
500
ServletTestExecutionListener
1000
MyCustomTestExecutionListener
ServletTestExecutionListener
-
Java
-
Kotlin
@ContextConfiguration
@TestExecutionListeners(
listeners = MyCustomTestExecutionListener.class,
mergeMode = MERGE_WITH_DEFAULTS
)
class MyTest {
// class body...
}
@ContextConfiguration
@TestExecutionListeners(
listeners = [MyCustomTestExecutionListener::class],
mergeMode = MERGE_WITH_DEFAULTS
)
class MyTest {
// class body...
}