Ayu*_*ain 4 spring integration-testing spring-test spring-boot
我们有一个库,为了自动配置库,我们在 ( 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
Run Code Online (Sandbox Code Playgroud)
我的理解是 spring.factories 是配置库和服务器用途的替代方案,类似于@SpringBootApplication普通应用程序。
我正在使用 using 进行集成@SpringBootTest,我希望从 spring.factories 提供的配置类配置我的上下文。当我运行这些测试时,spring 无法识别 spring.factories 并引发错误
java.lang.IllegalStateException:无法找到@SpringBootConfiguration,您需要在测试中使用@ContextConfiguration 或@SpringBootTest(classes=...)
PubSubConfig用 SpringBootApplication注释我,那么我的集成测试运行得很好,但由于它是一个库,我不想这样做。@SpringBootTest(classes = PubSubConfig.class)我的测试提供我的配置类运行良好。现在我试图理解为什么我需要专门做上述任何一项,因为 spring.factories 负责做我的自动配置
@SpringBootTest专为测试 Spring Boot 应用程序而设计。在没有任何其他配置的情况下,它会查找一个用@SpringBootConfiguration. 通常这是你的应用程序的主类,它被注释@SpringBootApplication(它用@SpringBootConfiguration.@SpringBootApplication元注释也被元注释,@EnableAutoConfiguration所以当@SpringBootTest发现- 注释@SpringBootApplication类自动配置被启用时,就像应用程序本身被执行。
当您尝试测试自动配置时,没有注释的类,@SpringBootConfiguration因此您会看到此失败:
java.lang.IllegalStateException:无法找到@SpringBootConfiguration,您需要在测试中使用@ContextConfiguration 或@SpringBootTest(classes=...)
正如您所指出的,您可以通过注释来解决问题PubSubConfig,@SpringBootApplication但您不应该这样做,因为它是一个库。@SpringBootTest(classes=PubSubConfig.class)是一个更好的解决方案,因为它避免了更改库的主代码,但是它仍然不理想,因为它的@SpringBootTest真正目的是测试 Spring Boot 应用程序,而不是打算在 Spring Boot 应用程序中使用的库。
而不是使用@SpringBootTest,我会建议使用ApplicationContextRunner。顾名思义,它是为运行应用程序上下文而设计的。它提供了用于配置自动配置和用户配置的构建器方法,这些方法应该用于创建上下文、设置属性等。它还提供了一个可断言的应用程序上下文,允许您轻松检查预期的 bean 是否已定义和尚未定义. 它在 Spring Boot 自己的自动配置测试中被广泛使用。
这是从 Spring Boot 自己的DataSource自动配置测试中获取的示例:
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class))
.withPropertyValues("spring.datasource.initialization-mode=never",
"spring.datasource.url:jdbc:hsqldb:mem:testdb-" + new Random().nextInt());
@Test
public void testDefaultDataSourceExists() {
this.contextRunner.run((context) -> assertThat(context).hasSingleBean(DataSource.class));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1765 次 |
| 最近记录: |