gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:43:02 24 4
gpt4 key购买 nike

我们有一个库,为了自动配置库,我们在( 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: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test


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

  • 现在我试图理解为什么我需要专门做上述任何一项,因为 spring.factories 负责做我的自动配置

    最佳答案

    @SpringBootTest专为测试 Spring Boot 应用程序而设计。没有任何其他配置,它会查找用 @SpringBootConfiguration 注释或元注释的类。 .通常这是你的应用程序的主类,用 @SpringBootApplication 注释。 (它用 @SpringBootConfiguration 元注释。@SpringBootApplication 也用 @EnableAutoConfiguration 元注释,所以当 @SpringBootTest 发现 @SpringBootApplication -注释类自动配置启用测试时应用程序本身正在执行。

    当您尝试测试自动配置时,没有用 @SpringBootConfiguration 注释的类。所以你看到这个失败:

    java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test



    正如您所指出的,您可以通过注释 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));
    }

    关于spring - 使用@SpringBootTest 的集成测试不会选择使用 spring.factories 配置的库的自动配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56594410/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com