此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

上下文配置继承

@ContextConfiguration支持布尔值inheritLocationsinheritInitializers表示资源位置还是组件类和上下文的属性 超类声明的初始化器应该被继承。两者的默认值 flags 是true.这意味着测试类继承资源位置或 组件类以及任何超类声明的上下文初始化器。 具体来说,将附加测试类的资源位置或组件类 添加到由 Superclasses 声明的资源位置或带注释的类的列表。 同样,给定测试类的初始化器将添加到初始化器集中 由 test superclasses 定义。因此,子类可以选择扩展资源 locations、Component classes 或 Context Initializers 的 Initializer 进行初始化。spring-doc.cadn.net.cn

如果inheritLocationsinheritInitializers属性@ContextConfiguration设置为false、资源位置或组件类以及上下文 initializers 分别用于测试类 shadow 并有效地替换 由超类定义的配置。spring-doc.cadn.net.cn

测试配置也可以从封闭类继承。看@Nestedtest 类配置了解详情。

在下一个使用 XML 资源位置的示例中,ApplicationContextExtendedTest加载自base-config.xmlextended-config.xml,按此顺序。 在extended-config.xml因此,可以覆盖(即替换)这些 定义于base-config.xml.下面的示例展示了一个类如何扩展 another 并使用自己的配置文件和 superclass 的配置文件:spring-doc.cadn.net.cn

@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 配置文件。
@ExtendWith(SpringExtension::class)
// ApplicationContext will be loaded from "/base-config.xml"
// in the root of the classpath
@ContextConfiguration("/base-config.xml") (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") (2)
class ExtendedTest : BaseTest() {
	// class body...
}
1 配置文件。
2 配置文件。

同样,在下一个使用组件类的示例中,ApplicationContextExtendedTestBaseConfigExtendedConfig类,因为 次序。在ExtendedConfig因此,可以覆盖 (即 replace) 在BaseConfig.下面的示例展示了一个类如何扩展 另一个,并使用自己的 Configuration 类和 Superclass 的 Configuration 类:spring-doc.cadn.net.cn

// 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 Configuration 类。
2 在子类中定义的 Configuration 类。
// ApplicationContext will be loaded from BaseConfig
@SpringJUnitConfig(BaseConfig::class) (1)
open class BaseTest {
	// class body...
}

// ApplicationContext will be loaded from BaseConfig and ExtendedConfig
@SpringJUnitConfig(ExtendedConfig::class) (2)
class ExtendedTest : BaseTest() {
	// class body...
}
1 Configuration 类。
2 在子类中定义的 Configuration 类。

在下一个使用上下文初始值设定项的示例中,ApplicationContextExtendedTest使用BaseInitializerExtendedInitializer.注意 但是,调用初始值设定项的顺序取决于它们是否 实现 Spring 的Ordered接口或用 Spring 的@Order注解 或标准@Priority注解。以下示例显示了一个类如何 扩展另一个 Initializer 并同时使用它自己的 Initializer 和 Superclass 的 Initializer:spring-doc.cadn.net.cn

// 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 Initializer 定义在超类中。
2 Initializer 在子类中定义。
// ApplicationContext will be initialized by BaseInitializer
@SpringJUnitConfig(initializers = [BaseInitializer::class]) (1)
open class BaseTest {
	// class body...
}

// ApplicationContext will be initialized by BaseInitializer
// and ExtendedInitializer
@SpringJUnitConfig(initializers = [ExtendedInitializer::class]) (2)
class ExtendedTest : BaseTest() {
	// class body...
}
1 Initializer 定义在超类中。
2 Initializer 在子类中定义。