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 单元测试注意事项(不注意的话,在单元测试时会报错:出现initializationerror初始化异常)