上下文配置继承

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

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

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

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

@ExtendWith(InfraExtension.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 在子类中定义的配置文件。

同样,在下一个使用组件类的示例中,ExtendedTestApplicationContext 按顺序从 BaseConfigExtendedConfig 类加载。因此,在 ExtendedConfig 中定义的 Bean 可以覆盖(即替换)在 BaseConfig 中定义的 Bean。以下示例显示了一个类如何扩展另一个类并同时使用其自己的配置类和超类的配置类:

  • Java

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

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

在下一个使用上下文初始化器的示例中,ExtendedTestApplicationContext 使用 BaseInitializerExtendedInitializer 进行初始化。但请注意,调用初始化器的顺序取决于它们是否实现了 Infra Ordered 接口,或者是否标注了 Infra @Order 注解或标准 @Priority 注解。以下示例显示了一个类如何扩展另一个类并同时使用其自己的初始化器和超类的初始化器:

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

// ApplicationContext 将由 BaseInitializer 和 ExtendedInitializer 初始化
@JUnitConfig(initializers = ExtendedInitializer.class) (2)
class ExtendedTest extends BaseTest {
  // 类主体...
}
1 在超类中定义的初始化器。
2 在子类中定义的初始化器。