对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
上下文配置继承
@ContextConfiguration
支持布尔值inheritLocations
和inheritInitializers
表示资源位置还是组件类和上下文的属性
超类声明的初始化器应该被继承。两者的默认值
flags 是true
.这意味着测试类继承资源位置或
组件类以及任何超类声明的上下文初始化器。
具体来说,将附加测试类的资源位置或组件类
添加到由 Superclasses 声明的资源位置或带注释的类的列表。
同样,给定测试类的初始化器将添加到初始化器集中
由 test superclasses 定义。因此,子类可以选择扩展资源
locations、Component classes 或 Context Initializers 的 Initializer 进行初始化。
如果inheritLocations
或inheritInitializers
属性@ContextConfiguration
设置为false
、资源位置或组件类以及上下文
initializers 分别用于测试类 shadow 并有效地替换
由超类定义的配置。
从 Spring Framework 5.3 开始,测试配置也可以从封闭中继承
类。看@Nested test 类配置了解详情。 |
在下一个使用 XML 资源位置的示例中,ApplicationContext
为ExtendedTest
加载自base-config.xml
和extended-config.xml
,按此顺序。
在extended-config.xml
因此,可以覆盖(即替换)这些
定义于base-config.xml
.下面的示例展示了一个类如何扩展
another 并使用自己的配置文件和 superclass 的配置文件:
-
Java
-
Kotlin
@ExtendWith(SpringExtension.class)
// ApplicationContext will be loaded from "/base-config.xml"
// in the root of the classpath
@ContextConfiguration("/base-config.xml") (1)
class BaseTest {
// class body...
}
// ApplicationContext will be loaded from "/base-config.xml" and
// "/extended-config.xml" in the root of the classpath
@ContextConfiguration("/extended-config.xml") (2)
class ExtendedTest extends BaseTest {
// class body...
}
1 | 配置文件。 |
2 | 配置文件。 |
@ExtendWith(SpringExtension::class)
// ApplicationContext will be loaded from "/base-config.xml"
// in the root of the classpath
@ContextConfiguration("/base-config.xml") (1)
open class BaseTest {
// class body...
}
// ApplicationContext will be loaded from "/base-config.xml" and
// "/extended-config.xml" in the root of the classpath
@ContextConfiguration("/extended-config.xml") (2)
class ExtendedTest : BaseTest() {
// class body...
}
1 | 配置文件。 |
2 | 配置文件。 |
同样,在下一个使用组件类的示例中,ApplicationContext
为ExtendedTest
从BaseConfig
和ExtendedConfig
类,因为
次序。在ExtendedConfig
因此,可以覆盖 (即 replace)
在BaseConfig
.下面的示例展示了一个类如何扩展
另一个,并使用自己的 Configuration 类和 Superclass 的 Configuration 类:
-
Java
-
Kotlin
// ApplicationContext will be loaded from BaseConfig
@SpringJUnitConfig(BaseConfig.class) (1)
class BaseTest {
// class body...
}
// ApplicationContext will be loaded from BaseConfig and ExtendedConfig
@SpringJUnitConfig(ExtendedConfig.class) (2)
class ExtendedTest extends BaseTest {
// class body...
}
1 | Configuration 类。 |
2 | 在子类中定义的 Configuration 类。 |
// ApplicationContext will be loaded from BaseConfig
@SpringJUnitConfig(BaseConfig::class) (1)
open class BaseTest {
// class body...
}
// ApplicationContext will be loaded from BaseConfig and ExtendedConfig
@SpringJUnitConfig(ExtendedConfig::class) (2)
class ExtendedTest : BaseTest() {
// class body...
}
1 | Configuration 类。 |
2 | 在子类中定义的 Configuration 类。 |
在下一个使用上下文初始值设定项的示例中,ApplicationContext
为ExtendedTest
使用BaseInitializer
和ExtendedInitializer
.注意
但是,调用初始值设定项的顺序取决于它们是否
实现 Spring 的Ordered
接口或用 Spring 的@Order
注解
或标准@Priority
注解。以下示例显示了一个类如何
扩展另一个 Initializer 并同时使用它自己的 Initializer 和 Superclass 的 Initializer:
-
Java
-
Kotlin
// ApplicationContext will be initialized by BaseInitializer
@SpringJUnitConfig(initializers = BaseInitializer.class) (1)
class BaseTest {
// class body...
}
// ApplicationContext will be initialized by BaseInitializer
// and ExtendedInitializer
@SpringJUnitConfig(initializers = ExtendedInitializer.class) (2)
class ExtendedTest extends BaseTest {
// class body...
}
1 | Initializer 定义在超类中。 |
2 | Initializer 在子类中定义。 |
// ApplicationContext will be initialized by BaseInitializer
@SpringJUnitConfig(initializers = [BaseInitializer::class]) (1)
open class BaseTest {
// class body...
}
// ApplicationContext will be initialized by BaseInitializer
// and ExtendedInitializer
@SpringJUnitConfig(initializers = [ExtendedInitializer::class]) (2)
class ExtendedTest : BaseTest() {
// class body...
}
1 | Initializer 定义在超类中。 |
2 | Initializer 在子类中定义。 |