跳到主要内容

上下文配置继承

DeepSeek V3 中英对照 Context Configuration Inheritance

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

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

备注

测试配置也可以从外部类继承。详情请参见 @Nested 测试类配置

在下一个使用 XML 资源位置的示例中,ExtendedTestApplicationContext 会从 base-config.xmlextended-config.xml 中加载,按此顺序。因此,在 extended-config.xml 中定义的 bean 可以覆盖(即替换)在 base-config.xml 中定义的 bean。以下示例展示了一个类如何扩展另一个类,并同时使用自己的配置文件以及父类的配置文件:

@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 {
// 类体...
}
java
  • 父类中定义的配置文件。

  • 子类中定义的配置文件。

同样地,在下一个使用组件类的示例中,ExtendedTestApplicationContext 会按照顺序从 BaseConfigExtendedConfig 类中加载。因此,ExtendedConfig 中定义的 bean 可以覆盖(即替换)BaseConfig 中定义的 bean。以下示例展示了如何扩展一个类,并使用其自身的配置类以及父类的配置类:

// ApplicationContext 将从 BaseConfig 加载
@SpringJUnitConfig(BaseConfig.class) 1
class BaseTest {
// 类体...
}

// ApplicationContext 将从 BaseConfig 和 ExtendedConfig 加载
@SpringJUnitConfig(ExtendedConfig.class) 2
class ExtendedTest extends BaseTest {
// 类体...
}
java
  • 在父类中定义的配置类。

  • 在子类中定义的配置类。

在下一个使用上下文初始化器的示例中,ExtendedTestApplicationContext 是通过使用 BaseInitializerExtendedInitializer 来初始化的。然而,需要注意的是,初始化器的调用顺序取决于它们是否实现了 Spring 的 Ordered 接口,或者是否使用了 Spring 的 @Order 注解或标准的 @Priority 注解。以下示例展示了如何让一个类继承另一个类,并使用其自身的初始化器以及父类的初始化器:

// ApplicationContext 将由 BaseInitializer 初始化
@SpringJUnitConfig(initializers = BaseInitializer.class) 1
class BaseTest {
// class 主体...
}

// ApplicationContext 将由 BaseInitializer 和 ExtendedInitializer 初始化
@SpringJUnitConfig(initializers = ExtendedInitializer.class) 2
class ExtendedTest extends BaseTest {
// class 主体...
}
java
  • 在父类中定义的 Initializer。

  • 在子类中定义的 Initializer。