使用 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 Security 进行 Spring Boot 单元测试
使用 spring-data-jpa 和 MockMvc 进行 spring boot junit 测试