上下文配置继承
@ContextConfiguration 支持布尔类型的 inheritLocations 和 inheritInitializers 属性,这些属性用于指示是否应继承由父类声明的资源位置、组件类以及上下文初始化器。这两个属性的默认值都是 true。这意味着测试类会继承任何父类声明的资源位置、组件类以及上下文初始化器。具体来说,测试类的资源位置或组件类会被添加到父类声明的资源位置或带注解的类列表中;同样,给定测试类的初始化器也会被添加到测试父类定义的初始化器集合中。因此,子类可以选择扩展这些资源位置、组件类或上下文初始化器。
如果@ContextConfiguration中的inheritLocations或inheritInitializers属性被设置为false,那么测试类的资源位置或组件类以及上下文初始化器将分别覆盖(“shadow”)并实际取代由父类定义的配置。
测试配置也可以从包含类继承。详情请参见@嵌套测试类配置。
在下一个示例中,由于使用了XML资源位置,ExtendedTest的ApplicationContext是按照base-config.xml和extended-config.xml的顺序进行加载的。因此,在extended-config.xml中定义的Bean可以覆盖(即替换)在base-config.xml中定义的Bean。以下示例展示了如何让一个类继承另一个类,并同时使用该类自己的配置文件以及父类的配置文件:
- Java
- Kotlin
@ExtendWith(SpringExtension.class)
// ApplicationContext将从类路径根目录下的 "/base-config.xml" 加载
@ContextConfiguration("/base-config.xml") 1
class BaseTest {
// 类体...
}
//ApplicationContext将从类路径根目录下的 "/base-config.xml" 和 "/extended-config.xml" 加载
@ContextConfiguration("/extended-config.xml") 2
class ExtendedTest extends BaseTest {
// 类体...
}
在超类中定义的配置文件。
在子类中定义的配置文件。
@ExtendWith(SpringExtension::class)
// ApplicationContext将从类路径根目录下的 "/base-config.xml" 加载
@ContextConfiguration("/base-config.xml") 1
open class BaseTest {
// 类体...
}
// ApplicationContext将从类路径根目录下的 "/base-config.xml" 和 "/extended-config.xml" 加载
@ContextConfiguration("/extended-config.xml") 2
class ExtendedTest : BaseTest() {
// 类体...
}
在超类中定义的配置文件。
在子类中定义的配置文件。
同样,在下一个示例中,该示例使用了组件类,ExtendedTest的ApplicationContext是按照BaseConfig和ExtendedConfig类的顺序从这两个类中加载的。因此,在ExtendedConfig中定义的Bean可以覆盖(即替换)在BaseConfig中定义的Bean。以下示例展示了如何让一个类扩展另一个类,并同时使用它自己的配置类和父类的配置类:
- Java
- Kotlin
// ApplicationContext将从BaseConfig中加载
@SpringJUnitConfig(BaseConfig.class) 1
class BaseTest {
// 类体...
}
// ApplicationContext将从BaseConfig和ExtendedConfig中加载
@SpringJUnitConfig(ExtendedConfig.class) 2
class ExtendedTest extends BaseTest {
// 类体...
}
在父类中定义的配置类。
在子类中定义的配置类。
// ApplicationContext将从BaseConfig中加载
@SpringJUnitConfig(BaseConfig::class) 1
open class BaseTest {
// 类体...
}
// ApplicationContext将从BaseConfig和ExtendedConfig中加载
@SpringJUnitConfig(ExtendedConfig::class) 2
class ExtendedTest : BaseTest() {
// 类体...
}
在父类中定义的配置类。
在子类中定义的配置类。
在下一个示例中,使用了上下文初始化器,ExtendedTest的ApplicationContext是通过使用BaseInitializer和ExtendedInitializer来初始化的。然而,请注意,初始化器的调用顺序取决于它们是否实现了Spring的Ordered接口,或者是否被Spring的@Order注解或标准的@Priority注解所标记。以下示例展示了如何让一个类扩展另一个类,并同时使用它自己的初始化器和超类的初始化器:
- Java
- Kotlin
// ApplicationContext 将由 BaseInitializer 初始化
@SpringJUnitConfig(initializers = BaseInitializer.class) 1
class BaseTest {
// 类体...
}
// ApplicationContext 将由 BaseInitializer 和 ExtendedInitializer 共同初始化
@SpringJUnitConfig(initializers = ExtendedInitializer.class) 2
class ExtendedTest extends BaseTest {
// 类体...
}
在超类中定义的初始化器。
在子类中定义的初始化器。
// ApplicationContext 将由 BaseInitializer 初始化
@SpringJUnitConfig(initializers = [BaseInitializer::class]) 1
open class BaseTest {
// 类体...
}
// ApplicationContext 将由 BaseInitializer 和 ExtendedInitializer 共同初始化
@SpringJUnitConfig(initializers = [ExtendedInitializer::class]) 2
class ExtendedTest : BaseTest() {
// 类体...
}
在超类中定义的初始化器。
在子类中定义的初始化器。