如何集成测试自定义Spring Boot样式启动程序库的自动配置?

时间:2017-03-28 19:19:09

标签: spring spring-boot spock spring-test

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

我想做类似于许多Spring Boot入门库提供的自动配置。那个,或者其他一些简单的声明方式,将我的库与使用它的应用程序的ApplicationContext集成。

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

但是,我无法找到任何可以作为我的库测试套件的一部分进行测试的好例子,它适合与Spring Boot应用程序集成。理想情况下,我会在库测试中直接创建一个简单的Spring Boot应用程序,只是为了测试,为它添加正确的注释,并能够声明然后配置了正确的bean。

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

如果仅仅为了测试我的库而启动一个这样的简单应用程序,我该怎么办?我的测试是用Spock和Spock-Spring编写的,以防其他测试框架发生变化。

2 个答案:

答案 0 :(得分:3)

我能够使用以下测试类:

@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中提到的类似的结构。

答案 1 :(得分:1)

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

总结一下,请确保您有一个auto-configuration注释@Configuration类,其中@ComponentScan可以扫描您的包。另外,请确保您创建了一个包含spring.factories类的auto-configuration文件,并删除了spring boot maven插件(包装正确)。

此外,请确保您的auto-configuraiton项目注释@SpringBootApplication@EnableAutoConfiguration或其他春季启动注释,只需要在主要的春季启动项目(每个堆栈中应该有一个)。

另请参阅以下文章:

Spring boot基于许多预先制作的自动配置父项目。您应该已经熟悉了Spring boot starter项目。

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

  1. 创建一些@Configuration类来定义默认bean。您应尽可能使用外部属性以允许自定义,并尝试使用自动配置帮助器注释,如@AutoConfigureBefore@AutoConfigureAfter@ConditionalOnBean@ConditionalOnMissingBean等。您可以找到有关官方文档Condition annotations
  2. 中每个注释的更多详细信息
  3. 放置一个聚合所有@Configuration类的自动配置文件/文件。
  4. 创建一个名为spring.factories的文件,并将其放在src/main/resources/META-INF
  5. spring.factories中,使用逗号分隔的org.springframework.boot.autoconfigure.EnableAutoConfiguration类值设置@Configuration属性:

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

  6. 确保您的auto-configuration初学者项目不包含spring boot maven plugin,因为它会将项目打包为可执行JAR,并且不会按类别路径加载类路径 - spring boot将无法找到您的spring.factories并且不会加载您的配置