我们有一个库,为了自动配置该库,我们使用{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 = ...)
PubSubConfig
,那么我的集成测试可以很好地运行,但是由于它是一个库,我不想这样做。@SpringBootTest(classes = PubSubConfig.class)
提供配置类,则测试运行良好。 现在,我正试图了解为什么我需要专门做上述任一操作,因为spring.factories负责执行我的自动配置
答案 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