SpringBoot 单元测试不使用 Application 类中的 @EnableAutoConfiguration 注解

Posted

技术标签:

【中文标题】SpringBoot 单元测试不使用 Application 类中的 @EnableAutoConfiguration 注解【英文标题】:SpringBoot unit test does not use @EnableAutoConfiguration annotation from Application class 【发布时间】:2017-06-23 05:29:05 【问题描述】:

我想配置一个 Spring Boot 应用程序,以便根本不使用任何数据库。 所以我注释了我的应用程序类以排除 JPA 自动配置类:

@SpringBootApplication
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class)
public class Application 

    public static void main(final String... args) 
        run(Application.class, args);
    

当服务独立运行时,这可以正常工作

不幸的是,我的测试类似乎忽略了注释,尽管我使用 Application 类进行测试

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SwaggerJsonExistenceTest 
    ...

测试失败并显示以下错误消息

引起:org.springframework.beans.factory.BeanCreationException: 创建名为“dataSource”的 bean 时出错:调用 init 方法 失败的;嵌套异常是 java.lang.IllegalStateException: 不能 确定用于测试的嵌入式数据库。如果你想要一个嵌入式 数据库请在类路径中放置一个受支持的数据库。

更新: 类路径上没有 DB 驱动程序。

org.springframework.boot:spring-boot-starter-data-jpa 用于测试(通过 gradle 中的 testCompile 指令包含)

如何配置测试以使其不使用与 db 相关的自动配置?

修复:我已删除所有 jpa 启动器依赖项(因为不需要 DB),因此根本没有完成数据源自动配置。

【问题讨论】:

类路径上有数据库驱动吗?您使用哪种弹簧靴启动器?如果你这样做,请将其删除。它将停止任何 db-autoconfiguration 魔术。 @BartoszBilicki 我已删除所有 jpa 入门依赖项。现在可以了,谢谢。虽然我还是不知道,为什么排除类对测试不起作用... 【参考方案1】:

@SpringBootApplication 注释有一个排除属性,在这种情况下您应该使用它来支持@EnableAutoConfiguration(exclude = ...)。如果你使用它,@SpringBootTest 注释测试应该正确地强制排除。

Spring Boot API - SpringBootApplication

【讨论】:

我已经移除了 EnableAutoConfiguration 注解,现在使用 @SpringBootApplication 的 exclude 属性。不幸的是,测试仍然失败并显示相同的错误消息 这很奇怪。请尝试排除JpaRepositoriesAutoConfiguration.class 如果你不需要任何数据库,你就不需要 Spring Data,你通过 spring-boot-starter-data-jpa 包含了它 是的,这样做是因为 Bartosz 的评论【参考方案2】:

我在使用 2.0.9.RELEASE 版本时遇到了这个问题,我必须使用它来遵守我的公司标准。对我有用的是:

@SpringBootTest(properties="spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration")

我不能确定这是否是我的 Springboot 版本中的 @EnableAutoConfiguration 的问题,但在 2.1.5.RELEASE 版本中,我不必使用 @SpringBootTest 设置属性来使其工作。

【讨论】:

以上是关于SpringBoot 单元测试不使用 Application 类中的 @EnableAutoConfiguration 注解的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot项目单元测试

使用springboot 单元测试注意事项(不注意的话,在单元测试时会报错:出现initializationerror初始化异常)

SpringBoot与单元测试JUnit的结合

SpringBoot与单元测试JUnit的结合

springboot单元测试不执行数据库

在没有启动应用程序的情况下在 SpringBoot 中编写单元测试