|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
上下文层级
在编写依赖加载Spring的积分测试时应用上下文是的
通常足以针对单一情境进行检验。然而,有时确实如此
有益甚至必要地用来测试应用上下文实例。例如,如果你正在开发一个 Spring MVC 网页应用,通常你会
有根WebApplicationContext由Spring's装载ContextLoaderListener以及一个
孩子WebApplicationContext由Spring's装载调度器服务.这导致
父子上下文层级结构,共享组件和基础设施配置
在根上下文中声明,并在子上下文中被网页特定调用
组件。另一个用例是在春季批处理应用中,你经常会这样
拥有一个父上下文,提供共享批处理基础设施的配置,并且
用于特定批处理作业配置的子上下文。
你可以通过声明上下文来编写使用上下文层级的集成测试
配置@ContextHierarchy注释,无论是单个测试类上的
或者在测试类层级中。如果在多个类上声明了上下文层级
在测试类层级中,你也可以合并或覆盖上下文配置
对于上下文层级中特定的命名层级。合并配置时
给定层级,配置资源类型(即XML配置)
文件或组件类)必须保持一致。否则,完全可以接受
在上下文层级中设置不同层级,使用不同的资源类型配置。
本节剩余的基于JUnit Jupiter的示例显示了共同的配置 需要使用上下文层级的集成测试场景。
带有上下文层级的单一测试类
控制器集成测试代表一个典型的集成测试场景
通过声明由两层组成的上下文层级,Spring MVC 网页应用,
一个代表根节点WebApplicationContext(通过使用TestAppConfig
@Configuration一个用于调度器servlet的类)WebApplicationContext(通过使用WebConfig @Configuration班级)。这WebApplicationContext自动接线到测试实例的就是子上下文的那个(即
层级中最低的上下文)。以下列表展示了该配置场景:
-
Java
-
Kotlin
@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
// ...
}
带有隐含父上下文的类层级
本例中的测试类定义了测试类内的上下文层级结构
等级制度。摘要WebTests(摘要网测试)声明根节点的配置WebApplicationContext在一个由Spring驱动的网页应用中。但请注意摘要WebTests(摘要网测试)不声明@ContextHierarchy.因此,的子类摘要WebTests(摘要网测试)可以选择参与上下文层级结构,或遵循
标准语义@ContextConfiguration.SoapWebServiceTests和RestWebServiceTesting两者都延伸摘要WebTests(摘要网测试)并定义上下文层级为
用@ContextHierarchy.结果是加载三个应用上下文(一个
对于每个@ContextConfiguration),并加载应用上下文
基于摘要WebTests(摘要网测试)是每个 的父上下文
具体子类加载的上下文。以下列表展示了这一点
配置场景:
-
Java
-
Kotlin
@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 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”}.
以下列表展示了该配置场景:
-
Java
-
Kotlin
@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() {}
带有覆盖上下文层级配置的类层级结构
与前例不同,本例展示了如何覆盖
在上下文层级中对给定命名层级的配置,通过设置继承地点旗帜@ContextConfiguration自false.因此,
应用上下文扩展测试仅从 加载/test-user-config.xml和
其父节点设置为从中加载的上下文/app-config.xml.以下列表
展示了以下配置场景:
-
Java
-
Kotlin
@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。 |