上下文配置继承
@ContextConfiguration
支持布尔型 inheritLocations
和 inheritInitializers
属性,它们表示是否应该继承超类声明的资源位置或组件类和上下文初始化器。这两个标志的默认值都是 true
。这意味着测试类继承了由任何超类声明的资源位置或组件类以及上下文初始化器。具体来说,测试类的资源位置或组件类将附加到超类声明的资源位置或注释类列表中。类似地,给定测试类的初始化器将添加到测试超类定义的初始化器集中。因此,子类可以选择扩展资源位置、组件类或上下文初始化器。
如果 @ContextConfiguration
中的 inheritLocations
或 inheritInitializers
属性设置为 false
,则测试类的资源位置或组件类以及上下文初始化器将分别覆盖并有效地替换超类定义的配置。
从 Spring Framework 5.3 开始,测试配置也可以从封闭类继承。有关详细信息,请参阅 @Nested 测试类配置。
|
在下一个示例中,使用 XML 资源位置,ExtendedTest
的 ApplicationContext
从 base-config.xml
和 extended-config.xml
加载,顺序为先加载 base-config.xml
,再加载 extended-config.xml
。因此,在 extended-config.xml
中定义的 Bean 可以覆盖(即替换)在 base-config.xml
中定义的 Bean。以下示例展示了如何让一个类扩展另一个类,并同时使用它自己的配置文件和超类的配置文件。
-
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 | 子类中定义的配置文件。 |
类似地,在下一个示例中,使用组件类,ExtendedTest
的 ApplicationContext
从 BaseConfig
和 ExtendedConfig
类加载,顺序为先加载 BaseConfig
,再加载 ExtendedConfig
。因此,在 ExtendedConfig
中定义的 Bean 可以覆盖(即替换)在 BaseConfig
中定义的 Bean。以下示例展示了如何让一个类扩展另一个类,并同时使用它自己的配置类和超类的配置类。
-
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 | 超类中定义的配置类。 |
2 | 子类中定义的配置类。 |
// 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 | 超类中定义的配置类。 |
2 | 子类中定义的配置类。 |
在下一个示例中,使用上下文初始化器,ExtendedTest
的 ApplicationContext
通过使用 BaseInitializer
和 ExtendedInitializer
初始化。但是,请注意,初始化器的调用顺序取决于它们是否实现了 Spring 的 Ordered
接口,或者是否使用 Spring 的 @Order
注解或标准的 @Priority
注解进行注释。以下示例展示了如何让一个类扩展另一个类,并同时使用它自己的初始化器和超类的初始化器。
-
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 | 超类中定义的初始化器。 |
2 | 子类中定义的初始化器。 |
// 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 | 超类中定义的初始化器。 |
2 | 子类中定义的初始化器。 |