【问题标题】:How to integration test auto configuration for a custom Spring Boot style starter library?如何为自定义 Spring Boot 样式启动库集成测试自动配置?
【发布时间】:2017-08-22 00:48:21
【问题描述】:

我正在编写一个库来提供一些在我使用的多个不同 Spring Boot 应用程序之间共享的功能。

我想做一些类似于现有的许多 Spring Boot 启动器库提供的​​自动配置的事情。或者其他一些简单的声明方式,将我的库与使用它的应用程序的 ApplicationContext 集成。

我找到了一些解释自动配置如何工作的资源。我可以解决上面的问题。

但是,我还没有找到任何好的示例来说明如何将其作为我的库的测试套件的一部分进行测试,该套件适合与 Spring Boot 应用程序集成。理想情况下,我会直接在库的测试中启动一个简单的 Spring Boot 应用程序,只是为了测试,为其添加正确的注释,并能够断言随后配置了正确的 bean。

我已尝试创建一个执行此操作的 TestApplication 类并使用 SpringBootTest 注释编写集成测试,但在我的测试开始之前从未启动过 TestApplication。

为了测试我的库,我能做些什么来启动这样一个简单的应用程序?我的测试是使用 Spock 和 Spock-Spring 编写的,以防与其他测试框架相比发生变化。

【问题讨论】:

    标签: spring spring-boot spock spring-test


    【解决方案1】:

    我能够使它与以下测试类一起工作:

    @SpringBootTest
    @ContextConfiguration(classes = TestApplication)
    class DummyIntegrationSpec extends Specification {
    
        @Autowired
        DummyService dummyService
    
        void 'dummy service should exist'() {
            expect:
            dummyService.getMessage() == DummyConfiguration.MESSAGE
        }
    }
    

    还有src/test/groovy/com/example/project/TestApplication.groovy的这个TestApplication类

    @SpringBootApplication(scanBasePackages = 'com.example.project.config')
    @EnableAutoConfiguration
    class TestApplication extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(TestApplication)
        }
    
        static void main(String[] args) {
            SpringApplication.run(TestApplication, args)
        }
    }
    

    当我将我的 TestApplication 类从 src/main 移动到 src/test 时,为了让 TestApplication 启动并加载正确的上下文,我必须进行的两个关键更改是:

    • 需要将TestApplication类添加到ContextConfiguration注解中

    • 需要将我的库的 Java 配置文件所在的包添加到 SpringBootApplication scanBasePackages 字段

    库自动配置确实遵循与提供的链接 tom 中提到的类似的结构。

    【讨论】:

    • 我认为这种方法不会测试自动配置,而是像没有任何自动配置 spring.factories 一样加载 @Configuration 注释类...
    【解决方案2】:

    您的自动配置应该在您的主 spring 应用程序/测试开始时自动选择,并且所有 bean 都将在您的上下文中注册。它们将可用于自动接线并遵循您的条件和初始化顺序。

    总而言之,确保您有一个由@Configuration 注释的自动配置类和一个@Import,该类导入您的@Configuration 注释配置类(在它们内部您定义带有@Bean 注释的方法的bean) .还要确保您创建了一个包含 auto-configuration 类的 spring.factories 文件,并确保您删除了 spring boot maven 插件(以确保打包正确)。

    另外,请确保您的 auto-configuration 项目@SpringBootApplication@EnableAutoConfiguration@ComponentScan 或其他只需要在主弹簧中的 Spring Boot 注释启动项目(每个堆栈中应该有一个)。

    另请参阅下面的文章:


    Spring boot 基于很多预制的自动配置父项目。您应该已经熟悉 Spring Boot 入门项目。

    您可以通过以下简单步骤轻松创建自己的入门项目:

    1. 创建一些@Configuration 类来定义默认bean。您应该尽可能使用外部属性以允许自定义,并尝试使用自动配置帮助器注解,如 @AutoConfigureBefore@AutoConfigureAfter@ConditionalOnBean@ConditionalOnMissingBean 等。您可以在每个注解中找到更多详细信息官方文档Condition annotations

    2. 放置一个聚合所有@Configuration 类的自动配置文件。

    3. 创建一个名为spring.factories 的文件并将其放入src/main/resources/META-INF

    4. spring.factories 中,使用@Configuration 类的逗号分隔值设置org.springframework.boot.autoconfigure.EnableAutoConfiguration 属性:

      org.springframework.boot.autoconfigure.EnableAutoConfiguration=
      com.mycorp.libx.autoconfigure.LibXAutoConfiguration,
      com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration 使用这种方法,您可以创建自己的自动配置类,这些类将由 spring-boot 选择。 Spring-boot 自动扫描所有 maven/gradle 依赖项以查找 spring.factories 文件,如果找到,则将其中指定的所有 @Configuration 类添加到其自动配置过程中。

    确保您的 auto-configuration 启动项目不包含 spring boot maven plugin,因为它将项目打包为可执行 JAR,并且不会按预期由类路径加载 - spring boot 将无法找到您的 @987654347 @ 并且不会加载您的配置

    【讨论】:

    • 这有助于创建自动配置,但不完全是我要问的问题。我要问的问题是,如何使用测试 Spring Boot 应用程序集成测试我的自动配置。
    • 正如我所提到的,一旦自动配置到位,您的所有 bean 都会加载到您的上下文中,您可以注入您的 bean(组件/服务/存储库等)以便在您的测试中测试它们类
    • 当 Application 类位于 src/main. Application 类已运行,并且所有 bean 都按预期配置。如果我将同一个应用程序类移动到 src/test,应用程序根本不会启动。没有 bean 被实例化。无论测试是使用@ContextConfiguration还是@SpringBootTest注解类字段引用Application类,行为都是一样的。
    猜你喜欢
    • 2020-04-11
    • 2016-10-10
    • 2020-11-06
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多