上下文配置继承
@ContextConfiguration
支持布尔类型的 inheritLocations
和 inheritInitializers
属性,它们表示是否应继承超类声明的资源位置或组件类以及上下文初始化器。这两个标志的默认值均为 true
。这意味着测试类会继承其所有超类声明的资源位置或组件类以及上下文初始化器。具体来说,测试类的资源位置或组件类会附加到超类声明的资源位置或注解类的列表中。类似地,给定测试类的初始化器会添加到测试超类定义的初始化器集中。因此,子类可以选择扩展资源位置、组件类或上下文初始化器。
如果 @ContextConfiguration
中的 inheritLocations
或 inheritInitializers
属性设置为 false
,则测试类的资源位置或组件类以及上下文初始化器将分别覆盖并有效地替换超类定义的配置。
测试配置也可以从封闭类继承。详情请参阅 |
在下一个使用 XML 资源位置的示例中,ExtendedTest
的 ApplicationContext
将按 base-config.xml
和 extended-config.xml
的顺序加载。因此,extended-config.xml
中定义的 Bean 可以覆盖(即替换)base-config.xml
中定义的 Bean。以下示例展示了一个类如何扩展另一个类,并同时使用其自己的配置文件和超类的配置文件:
- Java
-
@ExtendWith(SpringExtension.class) // ApplicationContext will be loaded from "/base-config.xml" // in the root of the classpath @ContextConfiguration("/base-config.xml") [id="CO1-1"]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") [id="CO1-2"]2 class ExtendedTest extends BaseTest { // class body... }
<1> 超类中定义的配置文件。 <1> 子类中定义的配置文件。
- Kotlin
-
@ExtendWith(SpringExtension::class) // ApplicationContext will be loaded from "/base-config.xml" // in the root of the classpath @ContextConfiguration("/base-config.xml") [id="CO2-1"][id="CO1-1"][id="CO2-1"](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") [id="CO2-2"][id="CO1-2"][id="CO2-2"](2) class ExtendedTest : BaseTest() { // class body... }
<1> 超类中定义的配置文件。 <1> 子类中定义的配置文件。
类似地,在下一个使用组件类的示例中,ExtendedTest
的 ApplicationContext
将按 BaseConfig
和 ExtendedConfig
类的顺序加载。因此,ExtendedConfig
中定义的 Bean 可以覆盖(即替换)BaseConfig
中定义的 Bean。以下示例展示了一个类如何扩展另一个类,并同时使用其自己的配置类和超类的配置类:
- Java
-
// ApplicationContext will be loaded from BaseConfig @SpringJUnitConfig(BaseConfig.class) [id="CO3-1"][id="CO1-3"][id="CO3-1"](1) class BaseTest { // class body... } // ApplicationContext will be loaded from BaseConfig and ExtendedConfig @SpringJUnitConfig(ExtendedConfig.class) [id="CO3-2"][id="CO1-4"][id="CO3-2"](2) class ExtendedTest extends BaseTest { // class body... }
<1> 超类中定义的配置类。 <1> 子类中定义的配置类。
- Kotlin
-
// ApplicationContext will be loaded from BaseConfig @SpringJUnitConfig(BaseConfig::class) [id="CO4-1"][id="CO1-5"][id="CO4-1"](1) open class BaseTest { // class body... } // ApplicationContext will be loaded from BaseConfig and ExtendedConfig @SpringJUnitConfig(ExtendedConfig::class) [id="CO4-2"][id="CO1-6"][id="CO4-2"](2) class ExtendedTest : BaseTest() { // class body... }
<1> 超类中定义的配置类。 <1> 子类中定义的配置类。
在下一个使用上下文初始化器的示例中,ExtendedTest
的 ApplicationContext
将通过使用 BaseInitializer
和 ExtendedInitializer
进行初始化。但请注意,初始化器的调用顺序取决于它们是否实现了 Spring 的 Ordered
接口,或者是否用 Spring 的 @Order
注解或标准 @Priority
注解进行了注解。以下示例展示了一个类如何扩展另一个类,并同时使用其自己的初始化器和超类的初始化器:
- Java
-
// ApplicationContext will be initialized by BaseInitializer @SpringJUnitConfig(initializers = BaseInitializer.class) [id="CO5-1"][id="CO1-7"][id="CO5-1"](1) class BaseTest { // class body... } // ApplicationContext will be initialized by BaseInitializer // and ExtendedInitializer @SpringJUnitConfig(initializers = ExtendedInitializer.class) [id="CO5-2"][id="CO1-8"][id="CO5-2"](2) class ExtendedTest extends BaseTest { // class body... }
<1> 超类中定义的初始化器。 <1> 子类中定义的初始化器。
- Kotlin
-
// ApplicationContext will be initialized by BaseInitializer @SpringJUnitConfig(initializers = [BaseInitializer::class]) [id="CO6-1"][id="CO1-9"][id="CO6-1"](1) open class BaseTest { // class body... } // ApplicationContext will be initialized by BaseInitializer // and ExtendedInitializer @SpringJUnitConfig(initializers = [ExtendedInitializer::class]) [id="CO6-2"][id="CO1-10"][id="CO6-2"](2) class ExtendedTest : BaseTest() { // class body... }
<1> 超类中定义的初始化器。 <1> 子类中定义的初始化器。