上下文配置继承

@ContextConfiguration 支持布尔类型的 inheritLocationsinheritInitializers 属性,它们表示是否应继承超类声明的资源位置或组件类以及上下文初始化器。这两个标志的默认值均为 true。这意味着测试类会继承其所有超类声明的资源位置或组件类以及上下文初始化器。具体来说,测试类的资源位置或组件类会附加到超类声明的资源位置或注解类的列表中。类似地,给定测试类的初始化器会添加到测试超类定义的初始化器集中。因此,子类可以选择扩展资源位置、组件类或上下文初始化器。

如果 @ContextConfiguration 中的 inheritLocationsinheritInitializers 属性设置为 false,则测试类的资源位置或组件类以及上下文初始化器将分别覆盖并有效地替换超类定义的配置。

测试配置也可以从封闭类继承。详情请参阅 @Nested 测试类配置

在下一个使用 XML 资源位置的示例中,ExtendedTestApplicationContext 将按 base-config.xmlextended-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>  子类中定义的配置文件。

类似地,在下一个使用组件类的示例中,ExtendedTestApplicationContext 将按 BaseConfigExtendedConfig 类的顺序加载。因此,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>  子类中定义的配置类。

在下一个使用上下文初始化器的示例中,ExtendedTestApplicationContext 将通过使用 BaseInitializerExtendedInitializer 进行初始化。但请注意,初始化器的调用顺序取决于它们是否实现了 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>  子类中定义的初始化器。