【问题标题】:Load data only from test/resources while testing with Spring Boot使用 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 你解决了吗?

标签: java spring hibernate spring-boot


【解决方案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 
      

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

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

      【讨论】:

        猜你喜欢
        • 2020-08-28
        • 1970-01-01
        • 2016-04-17
        • 2019-04-24
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        • 2019-05-17
        • 2020-07-10
        相关资源
        最近更新 更多