上下文配置继承

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

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

从Spring Framework 5.3开始,测试配置也可以从封闭类中继承。有关详细信息,请参阅@Nested测试类配置

在下一个示例中,使用XML资源位置,ExtendedTestApplicationContext将从base-config.xmlextended-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 {
	// 类体...
}
1 在超类中定义的配置文件。
2 在子类中定义的配置文件。
@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() {
	// 类体...
}
1 在超类中定义的配置文件。
2 在子类中定义的配置文件。

类似地,在下一个示例中,使用组件类,ExtendedTestApplicationContext将从BaseConfigExtendedConfig类中按顺序加载。因此,在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 {
	// 类体...
}
1 在超类中定义的配置类。
2 在子类中定义的配置类。
// ApplicationContext将从BaseConfig加载
@SpringJUnitConfig(BaseConfig::class) (1)
open class BaseTest {
	// 类体...
}

// ApplicationContext将从BaseConfig和ExtendedConfig加载
@SpringJUnitConfig(ExtendedConfig::class) (2)
class ExtendedTest : BaseTest() {
	// 类体...
}
1 在超类中定义的配置类。
2 在子类中定义的配置类。

在下一个示例中,使用了上下文初始化器,ExtendedTestApplicationContext通过BaseInitializerExtendedInitializer进行初始化。然而,需要注意的是,初始化器被调用的顺序取决于它们是否实现了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 {
	// 类体...
}
1 在父类中定义的初始化器。
2 在子类中定义的初始化器。
// ApplicationContext将由BaseInitializer初始化
@SpringJUnitConfig(initializers = [BaseInitializer::class]) (1)
open class BaseTest {
	// 类体...
}

// ApplicationContext将由BaseInitializer和ExtendedInitializer初始化
@SpringJUnitConfig(initializers = [ExtendedInitializer::class]) (2)
class ExtendedTest : BaseTest() {
	// 类体...
}
1 在父类中定义的初始化器。
2 在子类中定义的初始化器。