对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

上下文层级

在编写依赖加载Spring的积分测试时应用上下文是的 通常足以针对单一情境进行检验。然而,有时确实如此 有益甚至必要地用来测试应用上下文实例。例如,如果你正在开发一个 Spring MVC 网页应用,通常你会 有根WebApplicationContext由Spring's装载ContextLoaderListener以及一个 孩子WebApplicationContext由Spring's装载调度器服务.这导致 父子上下文层级结构,共享组件和基础设施配置 在根上下文中声明,并在子上下文中被网页特定调用 组件。另一个用例是在春季批处理应用中,你经常会这样 拥有一个父上下文,提供共享批处理基础设施的配置,并且 用于特定批处理作业配置的子上下文。spring-doc.cadn.net.cn

你可以通过声明上下文来编写使用上下文层级的集成测试 配置@ContextHierarchy注释,无论是单个测试类上的 或者在测试类层级中。如果在多个类上声明了上下文层级 在测试类层级中,你也可以合并或覆盖上下文配置 对于上下文层级中特定的命名层级。合并配置时 给定层级,配置资源类型(即XML配置) 文件或组件类)必须保持一致。否则,完全可以接受 在上下文层级中设置不同层级,使用不同的资源类型配置。spring-doc.cadn.net.cn

本节剩余的基于JUnit Jupiter的示例显示了共同的配置 需要使用上下文层级的集成测试场景。spring-doc.cadn.net.cn

带有上下文层级的单一测试类spring-doc.cadn.net.cn

控制器集成测试代表一个典型的集成测试场景 通过声明由两层组成的上下文层级,Spring MVC 网页应用, 一个代表根节点WebApplicationContext(通过使用TestAppConfig @Configuration一个用于调度器servlet的类)WebApplicationContext(通过使用WebConfig @Configuration班级)。这WebApplicationContext自动接线到测试实例的就是子上下文的那个(即 层级中最低的上下文)。以下列表展示了该配置场景:spring-doc.cadn.net.cn

@ExtendWith(SpringExtension.class)
@WebAppConfiguration
@ContextHierarchy({
	@ContextConfiguration(classes = TestAppConfig.class),
	@ContextConfiguration(classes = WebConfig.class)
})
class ControllerIntegrationTests {

	@Autowired
	WebApplicationContext wac;

	// ...
}
@ExtendWith(SpringExtension::class)
@WebAppConfiguration
@ContextHierarchy(
	ContextConfiguration(classes = [TestAppConfig::class]),
	ContextConfiguration(classes = [WebConfig::class]))
class ControllerIntegrationTests {

	@Autowired
	lateinit var wac: WebApplicationContext

	// ...
}

带有隐含父上下文的类层级spring-doc.cadn.net.cn

本例中的测试类定义了测试类内的上下文层级结构 等级制度。摘要WebTests(摘要网测试)声明根节点的配置WebApplicationContext在一个由Spring驱动的网页应用中。但请注意摘要WebTests(摘要网测试)不声明@ContextHierarchy.因此,的子类摘要WebTests(摘要网测试)可以选择参与上下文层级结构,或遵循 标准语义@ContextConfiguration.SoapWebServiceTestsRestWebServiceTesting两者都延伸摘要WebTests(摘要网测试)并定义上下文层级为 用@ContextHierarchy.结果是加载三个应用上下文(一个 对于每个@ContextConfiguration),并加载应用上下文 基于摘要WebTests(摘要网测试)是每个 的父上下文 具体子类加载的上下文。以下列表展示了这一点 配置场景:spring-doc.cadn.net.cn

@ExtendWith(SpringExtension.class)
@WebAppConfiguration
@ContextConfiguration("file:src/main/webapp/WEB-INF/applicationContext.xml")
public abstract class AbstractWebTests {}

@ContextHierarchy(@ContextConfiguration("/spring/soap-ws-config.xml"))
public class SoapWebServiceTests extends AbstractWebTests {}

@ContextHierarchy(@ContextConfiguration("/spring/rest-ws-config.xml"))
public class RestWebServiceTests extends AbstractWebTests {}
@ExtendWith(SpringExtension::class)
@WebAppConfiguration
@ContextConfiguration("file:src/main/webapp/WEB-INF/applicationContext.xml")
abstract class AbstractWebTests

@ContextHierarchy(ContextConfiguration("/spring/soap-ws-config.xml"))
class SoapWebServiceTests : AbstractWebTests()

@ContextHierarchy(ContextConfiguration("/spring/rest-ws-config.xml"))
class RestWebServiceTests : AbstractWebTests()

带有合并上下文层级配置的类层级spring-doc.cadn.net.cn

本例中的类展示了使用命名层级以合并 上下文层级中特定层级的配置。基础测试定义了两个层级 在等级体系中,父母孩子.扩展测试延伸基础测试并进行教学 Spring TestContext 框架用于合并上下文配置孩子通过确保在名称属性@ContextConfiguration两者皆为孩子.结果是三种应用上下文 是加载的:一个/app-config.xml,一个/user-config.xml,且一个{“/user-config.xml”, “/order-config.xml”}.与前述例子相同, 应用上下文从/app-config.xml被设置为 的父上下文 上下文加载自/user-config.xml{“/user-config.xml”, “/order-config.xml”}. 以下列表展示了该配置场景:spring-doc.cadn.net.cn

@ExtendWith(SpringExtension.class)
@ContextHierarchy({
	@ContextConfiguration(name = "parent", locations = "/app-config.xml"),
	@ContextConfiguration(name = "child", locations = "/user-config.xml")
})
class BaseTests {}

@ContextHierarchy(
	@ContextConfiguration(name = "child", locations = "/order-config.xml")
)
class ExtendedTests extends BaseTests {}
@ExtendWith(SpringExtension::class)
@ContextHierarchy(
	ContextConfiguration(name = "parent", locations = ["/app-config.xml"]),
	ContextConfiguration(name = "child", locations = ["/user-config.xml"]))
open class BaseTests {}

@ContextHierarchy(
	ContextConfiguration(name = "child", locations = ["/order-config.xml"])
)
class ExtendedTests : BaseTests() {}

带有覆盖上下文层级配置的类层级结构spring-doc.cadn.net.cn

与前例不同,本例展示了如何覆盖 在上下文层级中对给定命名层级的配置,通过设置继承地点旗帜@ContextConfigurationfalse.因此, 应用上下文扩展测试仅从 加载/test-user-config.xml和 其父节点设置为从中加载的上下文/app-config.xml.以下列表 展示了以下配置场景:spring-doc.cadn.net.cn

@ExtendWith(SpringExtension.class)
@ContextHierarchy({
	@ContextConfiguration(name = "parent", locations = "/app-config.xml"),
	@ContextConfiguration(name = "child", locations = "/user-config.xml")
})
class BaseTests {}

@ContextHierarchy(
	@ContextConfiguration(
		name = "child",
		locations = "/test-user-config.xml",
		inheritLocations = false
))
class ExtendedTests extends BaseTests {}
@ExtendWith(SpringExtension::class)
@ContextHierarchy(
	ContextConfiguration(name = "parent", locations = ["/app-config.xml"]),
	ContextConfiguration(name = "child", locations = ["/user-config.xml"]))
open class BaseTests {}

@ContextHierarchy(
		ContextConfiguration(
				name = "child",
				locations = ["/test-user-config.xml"],
				inheritLocations = false
		))
class ExtendedTests : BaseTests() {}
在上下文层级中对上下文进行脏化
如果你使用,@DirtiesContext在上下文配置为 上下文层级,你可以使用层级模式用flag来控制上下文缓存的设置 已清白。更多细节请参见@DirtiesContext春季测试注释和@DirtiesContextJavadoc。