当前位置: 首页 > 知识库问答 >
问题:

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

彭存
2023-03-14

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

参考资料 : 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。工厂并抛出一个错误

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

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

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

共有2个答案

景岳
2023-03-14

在任何Spring Boot自动配置问题中,我建议将debug:true property添加到appplication.yaml。这会导致额外的调试日志,显示哪些自动配置类被选取(具有匹配的条件)和哪些未被选取。在后一种情况下,它显示哪些条件不匹配。

这是一篇关于此的好文章:https://www.baeldung.com/spring-boot-auto-configuration-report

皇甫展
2023-03-14

@SpringBootTest旨在测试Spring Boot应用程序。在没有任何其他配置的情况下,它会查找用@SpringBootConfiguration注释或元注释的类。通常,这是您的应用程序的主类,它用@SpringBootApplication注释(它用@SpringBootConfiguration元注释。@SpringBootApplication也用@EnableAutoConfiguration元注释,因此当@SpringBootTest找到@SpringBootApplication-注释的类自动配置为测试启用,就像执行应用程序本身时一样。

当您试图测试您的自动配置时,没有用< code > @ spring boot configuration 注释的类,所以您会看到这个失败:

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

正如您所提到的,您可以通过用< code > @ spring boot application 注释< code>PubSubConfig来解决这个问题,但是您不应该这样做,因为它是一个库。< code > @ spring boot test(classes = pubsubonconfig . class)是一个更好的解决方案,因为它避免了更改库的主代码,但是它仍然不理想,因为< code>@SpringBootTest实际上旨在测试Spring Boot应用程序,而不是旨在用于Spring Boot应用程序的库。

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

这里有一个来自Spring Boot自己的< code>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));
}
 类似资料:
  • 我有一些问题。 允许在集成测试类中自动拥有控制器? 如何为这个控制器创建bean. 我有配置问题:help:

  • 我有一个SpringBootTest集成测试,用于我正在开发的某个框架,该框架使用与SpringBootApplication内置的jpa。我添加了支持在没有jpa的情况下使用框架,为此我需要创建一个不使用jpa的不同的SpringBootApplication。 现在,单独运行时的测试类工作得很好,但是当我一起运行它时(运行不同Spring应用程序的不同测试类),第二顺序测试类失败,因为我似乎没

  • 文件规定: 开发自动配置和使用条件 如果您在开发共享库的公司工作,或者如果您在开源或商业库工作,您可能希望开发自己的自动配置。自动配置类可以捆绑在外部罐中,并且仍然可以通过Spring Boot拾取。 如果我对其他所有内容都有注释(甚至是@自动配置后注释或@自动配置前注释), 为什么要维护一个属性文件来指向一个带有注释的类?

  • 我的项目中有一堆测试,它们都用@SpringBootTest注释,因此加载了一个SpringBoot上下文。 最近,我重构了一个测试,在这个测试中,我想要一个更小的范围(它是关于camunda的进程复盖率)到@RunWith(SpringJunit4ClassRunner.class)。因为这意味着没有上下文是自动加载的,所以我用静态内部类配置“手动”创建了一些bean。整个测试如下所示: 我不能

  • 41.3.5 自动配置的测试 Spring Boot的自动配置系统适用于应用程序,但对测试来说有时可能有点过了,最好是仅加载程序要测试的“切片”所需的部分配置。例如,您可能想测试Spring MVC的控制器是否正确地映射了URL,而且您不想在这些测试中涉及数据库调用;或者您可能想要测试JPA实体,而当这些测试运行时,您对Web层并不感兴趣。 spring-boot-test-autoconfigu

  • 41.3.6 自动配置的JSON测试 要测试JSON对象的序列化和反序列化是否按预期工作,您可以使用@JsonTest注解。@JsonTest将自动配置Jackson的ObjectMapper、所有@JsonComponentbean以及所有Jackson的Modules。如果您恰好使用Gson替代Jackson或是与Jackson一起使用,@JsonTest也会配置Gson。如果需要去配置自动配