使用@SpringBootTest的集成测试未选择使用spring.factories配置的库的自动配置

时间:2019-06-14 08:34:13

标签: spring spring-boot integration-testing spring-test

我们有一个库,为了自动配置该库,我们使用{src/main/resources/META-INF)下的spring.factories文件,该文件提供了一些类来自动配置我的库。

参考:https://docs.spring.io/spring-boot/docs/1.4.0.M3/reference/htmlsingle/#boot-features-custom-starter

spring.factories文件中的配置如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.x.y.PubSubConfig

我的理解是spring.factories是一种配置库和服务器用途的替代方法,类似于普通应用程序中的@SpringBootApplication

我正在使用@SpringBootTest进行集成,我希望从spring.factories提供的配置类中配置上下文。当我运行这些测试时,spring无法识别spring.factories并引发错误

  

java.lang.IllegalStateException:无法找到@SpringBootConfiguration,您需要在测试中使用@ContextConfiguration或@SpringBootTest(classes = ...)

  • 如果我用SpringBootApplication注释PubSubConfig,那么我的集成测试可以很好地运行,但是由于它是一个库,我不想这样做。
  • 如果我专门使用@SpringBootTest(classes = PubSubConfig.class)提供配置类,则测试运行良好。

现在,我正试图了解为什么我需要专门做上述任一操作,因为spring.factories负责执行我的自动配置

1 个答案:

答案 0 :(得分:1)

@SpringBootTest设计用于测试Spring Boot应用程序。在没有任何其他配置的情况下,它将寻找带有@SpringBootConfiguration注释或元注释的类。通常,这是用@SpringBootApplication注释的应用程序的主类(它用@SpringBootConfiguration进行元注释。@SpringBootApplication也用@EnableAutoConfiguration进行元注释,因此当{{1 }}发现已为测试启用了@SpringBootTest注释的类自动配置,就像在执行应用程序本身时一样。

当您尝试测试自动配置时,没有用@SpringBootApplication注释的类,因此您会看到此失败:

  

java.lang.IllegalStateException:无法找到@SpringBootConfiguration,您需要在测试中使用@ContextConfiguration或@SpringBootTest(classes = ...)

如前所述,您可以通过用@SpringBootConfiguration注释PubSubConfig来解决问题,但由于它是一个库,因此不应该这样做。 @SpringBootApplication是一个更好的解决方案,因为它避免了更改库的主代码,但是它仍然不是理想的选择,因为@SpringBootTest(classes=PubSubConfig.class)确实旨在测试Spring Boot应用程序,而不是旨在用于Spring Boot的库。应用。

我建议不要使用@SpringBootTest,而不要使用@SpringBootTest。顾名思义,它是为运行应用程序上下文而设计的。它提供了用于配置自动配置和用户配置的构建器方法,这些方法应用于创建上下文,设置属性等。它还提供了一个可断言的应用程序上下文,使您可以轻松地检查是否已定义了预期的bean。 。它在自动配置中广泛用于Spring Boot的测试中。

这是一个来自Spring Boot自身ApplicationContextRunner自动配置的测试示例:

DataSource