此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring Framework 6.1.13spring-doc.cn

此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring Framework 6.1.13spring-doc.cn

Spring 提供了以下已注册的实现 默认情况下,完全按以下顺序:TestExecutionListenerspring-doc.cn

  • ServletTestExecutionListener:为 配置 Servlet API 模拟。WebApplicationContextspring-doc.cn

  • DirtiesContextBeforeModesTestExecutionListener:处理 “before” 模式的注释。@DirtiesContextspring-doc.cn

  • ApplicationEventsTestExecutionListener:提供对 ApplicationEvents 的支持。spring-doc.cn

  • DependencyInjectionTestExecutionListener:为测试提供依赖项注入 实例。spring-doc.cn

  • MicrometerObservationRegistryTestExecutionListener:提供支持 千分尺的 .ObservationRegistryspring-doc.cn

  • DirtiesContextTestExecutionListener:处理 “after” 模式。@DirtiesContextspring-doc.cn

  • CommonCachesTestExecutionListener:如有必要,清除测试中的资源缓存。ApplicationContextspring-doc.cn

  • TransactionalTestExecutionListener:提供事务测试执行 default 回滚语义。spring-doc.cn

  • SqlScriptsTestExecutionListener:运行使用注释配置的 SQL 脚本。@Sqlspring-doc.cn

  • EventPublishingTestExecutionListener:将测试执行事件发布到测试的 (请参阅 测试执行事件)。ApplicationContextspring-doc.cn

注册实现TestExecutionListener

你可以显式地为测试类注册实现,它的 子类及其嵌套类。有关详细信息和示例,请参阅 Comments Support 和 javadoc for @TestExecutionListenersTestExecutionListener@TestExecutionListenersspring-doc.cn

切换到默认实现TestExecutionListener

如果您扩展了一个带有注解的类,并且您需要 切换到使用默认的侦听器集,您可以使用 以后。@TestExecutionListenersspring-doc.cn

// Switch to default listeners
@TestExecutionListeners(
	listeners = {},
	inheritListeners = false,
	mergeMode = MERGE_WITH_DEFAULTS)
class MyTest extends BaseTest {
	// class body...
}
// Switch to default listeners
@TestExecutionListeners(
	listeners = [],
	inheritListeners = false,
	mergeMode = MERGE_WITH_DEFAULTS)
class MyTest : BaseTest {
	// class body...
}
切换到默认实现TestExecutionListener

如果您扩展了一个带有注解的类,并且您需要 切换到使用默认的侦听器集,您可以使用 以后。@TestExecutionListenersspring-doc.cn

// Switch to default listeners
@TestExecutionListeners(
	listeners = {},
	inheritListeners = false,
	mergeMode = MERGE_WITH_DEFAULTS)
class MyTest extends BaseTest {
	// class body...
}
// Switch to default listeners
@TestExecutionListeners(
	listeners = [],
	inheritListeners = false,
	mergeMode = MERGE_WITH_DEFAULTS)
class MyTest : BaseTest {
	// class body...
}

自动发现默认实施TestExecutionListener

使用 is 注册实现 适用于在有限测试场景中使用的自定义监听器。但是,它可以 如果需要在整个测试套件中使用自定义侦听器,则会变得很麻烦。这 此问题已通过支持通过 MECHANISM 自动发现默认实现得到解决。TestExecutionListener@TestExecutionListenersTestExecutionListenerSpringFactoriesLoaderspring-doc.cn

例如,该模块在 key in 它的 META-INF/spring.factories 属性文件。第三方框架和开发人员可以将自己的实现贡献给同一 方式。spring-testTestExecutionListenerorg.springframework.test.context.TestExecutionListenerTestExecutionListenerspring.factoriesspring-doc.cn

订购实现TestExecutionListener

当 TestContext 框架发现默认实现时 通过上述机制,实例化的监听器使用 Spring 的,它遵循 Spring 的接口和注释进行排序。 以及 Spring 提供的所有默认实现都使用 适当的值。因此,第三方框架和开发人员应确保 它们的默认 implementations 以正确的 Sequences 注册 通过实现或声明 .有关核心默认实现的方法,请参阅 javadoc 以了解 值将分配给每个核心侦听器。TestExecutionListenerSpringFactoriesLoaderAnnotationAwareOrderComparatorOrdered@OrderAbstractTestExecutionListenerTestExecutionListenerOrderedTestExecutionListenerOrdered@OrdergetOrder()TestExecutionListenerspring-doc.cn

合并实施TestExecutionListener

如果自定义是通过 注册的, 默认侦听器未注册。在最常见的测试场景中,这有效地 强制开发人员手动声明所有默认侦听器以及任何自定义 听众。下面的清单演示了这种配置样式:TestExecutionListener@TestExecutionListenersspring-doc.cn

@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...
}

这种方法的挑战在于它要求开发人员确切地知道 默认注册哪些侦听器。此外,默认侦听器集可以 从一个版本到另一个版本的变化 — 例如,WAS 在 Spring Framework 4.1 中引入,并在 Spring Framework 4.2 中引入。此外,像 Spring 这样的第三方框架 Boot 和 Spring Security 使用上述 automatic discovery mechanism 注册自己的默认实现。SqlScriptsTestExecutionListenerDirtiesContextBeforeModesTestExecutionListenerTestExecutionListenerspring-doc.cn

为避免必须了解并重新声明所有默认侦听器,您可以将 的属性设置为 。 指示本地声明的侦听器应与 default 侦听器。合并算法可确保从 list 中,并且生成的合并侦听器集根据语义进行排序 的,如TestExecutionListener 实现进行排序中所述。 如果侦听器实现 或用 注释 ,则它可以影响 位置,它与默认值合并。否则,本地声明的侦听器 在合并时附加到默认侦听器列表中。mergeMode@TestExecutionListenersMergeMode.MERGE_WITH_DEFAULTSMERGE_WITH_DEFAULTSAnnotationAwareOrderComparatorOrdered@Orderspring-doc.cn

例如,如果上一个示例中的类 将其值(例如)配置为小于 的顺序(恰好是 ),然后可以自动与 defaults 的 ,前面的示例可以 替换为以下内容:MyCustomTestExecutionListenerorder500ServletTestExecutionListener1000MyCustomTestExecutionListenerServletTestExecutionListenerspring-doc.cn

@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...
}