混合使用 XML、Groovy 脚本和组件类

有时可能需要混合使用 XML 配置文件、Groovy 脚本和组件类(通常是 `@Configuration` 类)来为测试配置 `ApplicationContext`。例如,如果在生产环境中使用 XML 配置,您可能决定在测试中使用 `@Configuration` 类来配置特定的 Spring 管理的组件,反之亦然。此外,一些第三方框架(如 Spring Boot)提供了一流的支持,可以同时从不同类型的资源(例如,XML 配置文件、Groovy 脚本和 `@Configuration` 类)加载 `ApplicationContext`。

Spring Framework 在历史上并不支持标准部署的这种做法。因此,Spring Framework 在 `spring-test` 模块中提供的大多数 `SmartContextLoader` 实现都只支持每种测试上下文的一种资源类型。然而,这并不意味着您不能同时使用两者。一般规则的一个例外是 `GenericGroovyXmlContextLoader` 和 `GenericGroovyXmlWebContextLoader` 同时支持 XML 配置文件和 Groovy 脚本。此外,第三方框架可能会选择通过 `@ContextConfiguration` 支持同时声明 `locations` 和 `classes`,并且借助 TestContext 框架中的标准测试支持,您有以下选项。

如果您想使用资源位置(例如,XML 或 Groovy)和 `@Configuration` 类来配置您的测试,您必须选择其中一个作为入口点,并且该入口点必须包含或导入另一个。例如,在 XML 或 Groovy 脚本中,您可以使用组件扫描或将它们定义为普通的 Spring Bean 来包含 `@Configuration` 类,而在 `@Configuration` 类中,您可以使用 `@ImportResource` 导入 XML 配置文件或 Groovy 脚本。请注意,这种行为在语义上等同于您在生产环境中配置应用程序的方式:在生产配置中,您可以定义一组 XML 或 Groovy 资源位置,或者一组用于加载生产环境 `ApplicationContext` 的 `@Configuration` 类,但您仍然可以自由地包含或导入其他类型的配置。