Context Configuration Inheritance
@ContextConfiguration
支持布尔类型的 inheritLocations
和 inheritInitializers
属性,这些属性表示是否应继承超类声明的资源位置或组件类和 context 初始化器。这两个标志的默认值为 true
。这意味着测试类会继承超类声明的资源位置或组件类以及 context 初始化器。具体来说,测试类的资源位置或组件类追加到超类声明的资源位置或带注解的类的列表。类似地,某个测试类的初始化器会添加到按测试超类定义的初始化器集合中。因此,子类可以选择扩展资源位置、组件类或 context 初始化器。
如果 @ContextConfiguration
中的 inheritLocations
或 inheritInitializers
属性设置为 false
,该测试类的资源位置或组件类以及 context 初始化器将遮蔽并有效替换超类定义的配置。
从 Spring Framework 5.3 开始,还可以从封闭类继承测试配置。请参阅 |
在使用 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") 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 | 在子类中定义的配置文件。
|
3 | 在超类中定义的配置文件。 |
4 | 在子类中定义的配置文件。 |
类似地,在使用组件类的下一个示例中,ExtendedTest
的 ApplicationContext
按如下顺序从 BaseConfig
和 ExtendedConfig
类中加载。因此,ExtendedConfig
中定义的 bean 可以覆盖(即替换)BaseConfig
中定义的 bean。以下示例说明了一个类如何可以扩展另一个类,并同时使用自己的配置类和超类的配置类:
- Java
-
// 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 | 在子类中定义的配置类。
|
3 | 在超类中定义的配置类。 |
4 | 在子类中定义的配置类。 |
在使用 context 初始化器的下一个示例中,ExtendedTest
的 ApplicationContext
使用 BaseInitializer
和 ExtendedInitializer
初始化。然而请注意,初始化器被调用的顺序取决于它们是否实现了 Spring 的 Ordered
接口,或者是否用 Spring 的 @Order
注解或标准的 @Priority
注解进行了注解。以下示例说明了一个类如何可以扩展另一个类,并同时使用自己的初始化器和超类的初始化器:
- Java
-
// 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 | 子类中定义的初始化程序。
|
3 | 在超类中定义的初始化程序。 |
4 | 子类中定义的初始化程序。 |