You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.0.1测试中如何仅加载schema.sql不加载data.sql

问题分析与解决方案

为什么spring.datasource.initialization-mode: never无效?

Spring Boot 2.5版本起就废弃了spring.datasource.initialization-mode属性,改用spring.sql.init.*系列配置管理SQL脚本初始化逻辑。到Spring Boot 3.0时,这个旧属性已被完全移除,配置它不会产生任何效果,因此你的data.sql依然会被默认加载(Spring Boot默认会执行classpath下的data.sql)。

实现仅加载schema.sql、不加载data.sql的几种方法

方法1:通过spring.sql.init配置精准控制脚本加载

在src/main/resources/application-test.yaml中添加以下配置:

spring:
  sql:
    init:
      # 指定只加载schema.sql
      schema-locations: classpath:schema.sql
      # 空字符串表示不加载任何数据初始化脚本
      data-locations: ""
      # 显式指定初始化模式为always(默认值,可省略)
      mode: always

该配置直接指定要执行的表结构脚本,同时将数据脚本路径设为空,确保仅创建表结构、不插入初始数据。

方法2:利用@Sql注解在测试类中显式加载schema

若不想修改配置文件,可通过测试注解控制脚本加载:

  1. 先在application-test.yaml中禁用自动初始化:
spring:
  sql:
    init:
      mode: never
  1. 然后在测试类上添加@Sql注解显式加载表结构:
@DataJpaTest
@ActiveProfiles("test")
@Sql(scripts = "/schema.sql") // 显式执行schema.sql创建表
class ProductRepositoryTest {
    // 原有测试代码保持不变
}

这种方式完全由测试代码控制脚本加载,灵活性更强。

方法3:调整文件位置(可选)

如果data.sql仅用于生产/开发环境,可将其重命名为data-dev.sql,并在开发环境配置中指定加载它,测试环境默认不会识别该文件,自然不会执行插入逻辑。不过这种方式不如前两种直接。

验证效果

配置完成后重新运行测试,数据库只会创建product表,无初始数据,测试代码插入的1条数据会被正确统计,断言assertEquals(1, this.productRepository.findAll().size())可正常通过。

内容的提问来源于stack exchange,提问作者user3275784

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:15:25