使用 Spring Boot 进行测试时仅从测试/资源中加载数据

Posted

技术标签:

【中文标题】使用 Spring Boot 进行测试时仅从测试/资源中加载数据【英文标题】:Load data only from test/resources while testing with Spring Boot 【发布时间】:2018-12-23 18:52:52 【问题描述】:

我有一个与 Hibernate 集成的 Spring Boot 应用程序用于数据库持久性。

我有两个不同的 data.sql 文件:

在 src/main/resources 中有一个用于数据库初始化 在 src/test/resources 中有一个用于测试目的

在测试时,它们都在任何测试类之前加载。但是,我只想加载测试/资源之一,只保留主/资源并仅用于应用初始化。

我该怎么做?

谢谢。

【问题讨论】:

你能展示你的 Spring Boot 注释以用于 main 和 testing 吗? @EstanislaoPérezNartallo 与休眠相关的唯一注释是 spring.jpa.hibernate.ddl-auto=create 在他们两个中 @AlbertoCastaño 你解决了吗? 【参考方案1】:

您应该将 spring.jpa.hibernate.ddl-auto=create 更改为 update(它只更新 .sql 文件中的更改),因为每次应用程序运行时创建,“清理数据库”,这就是为什么两个 .sql每次都会处理。

希望这能解决你的问题。

【讨论】:

不!也许我对自己的解释不够好。我想要的是每次运行测试时从头开始实际创建数据库,但只能从 test/resources/data.sql,而不是从 main/resources/data.sql。现在它们都被调用了 正如@Rahul 所说,您不能停止加载 main/resources .sql 文件。因为是应用程序运行所必需的。【参考方案2】:

如果测试类正在启动 Spring Boot 应用程序,那么我认为您不能停止加载 main/resources .sql 文件。

但是如果您想在方法执行之前/之后(在测试类中)从测试/资源加载 .sql 文件,那么您可以使用 @SqlGroup 注释。

@SqlGroup(
    @Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:beforeTestRun.sql"),
    @Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts = "classpath:afterTestRun.sql")

          )

【讨论】:

【参考方案3】:

您可以将以下配置(至少在 spring boot 2 中)添加到您的测试 application.yaml 或 application.properties 文件中。

spring:
  datasource:
    data: data.sql

一旦设置了这个值,spring boot 只会在运行测试时加载测试 data.sql。

【讨论】:

【参考方案4】:

为测试维护一个单独的属性文件,因为它将帮助您在测试和开发之间分离事物。

application.properties for dev
application-local.properties for local env
application-test.properties for test 

根据您的需要拥有配置文件并具有与配置文件相关的属性。

另一种选择是根据您的需要覆盖属性。

【讨论】:

以上是关于使用 Spring Boot 进行测试时仅从测试/资源中加载数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 进行 Kotlin 集成测试

使用 Spring Security 进行 Spring Boot 单元测试

Spring Boot 项目在 IDEA 中 进行单元测试

使用 spring-data-jpa 和 MockMvc 进行 spring boot junit 测试

使用 JMH 对 Spring Boot 应用程序进行基准测试

[翻译]使用Spring Boot进行单元测试