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

Hibernate集成测试问题:SQL语法错误与data.sql配置排查

问题解决方案

一、仅加载/test/resources/data.sql并修复H2语法错误

1. 配置仅读取测试目录的SQL文件

在/test/resources/application.properties中添加以下配置,强制指定初始化SQL只加载测试目录下的文件,避免同时读取main/resources中的文件:

spring.sql.init.data-locations=classpath:data.sql

如果希望完全通过测试类注解控制SQL加载,可关闭自动初始化:

spring.sql.init.mode=never

之后在测试类或方法上通过@Sql("classpath:data.sql")指定测试用SQL文件即可。

2. 修复H2语法错误

报错核心原因有两个,针对性修改即可:

  • H2不支持MySQL特有的engine=InnoDB语法,直接删除该语句;
  • user是H2保留关键字,需用反引号(适配MySQL模式)包裹表名。

修改后的data.sql示例:

create table if not exists `user` (
    id bigint not null auto_increment,
    coins bigint,
    country varchar(255),
    level integer not null,
    primary key (id)
);

多建表语句保持分号分隔,避免使用H2不兼容的MySQL语法。

二、MockMvc集成测试中H2内存库数据清理问题

  • 默认行为:每个@SpringBootTest测试类会启动独立Spring上下文,对应全新的H2内存库,测试类间数据不共享;但同一测试类的多个测试方法会复用上下文,数据会保留。
  • 清理方案:
    • 方案1:给测试方法添加@Transactional注解,测试结束后Spring自动回滚事务,数据恢复初始状态;
    • 方案2:用@Sql注解在测试后执行清理语句,示例:
      @Test
      @Sql(value = "classpath:mysql-db-dumb.sql", executionPhase = BEFORE_TEST_METHOD)
      @Sql(value = "classpath:cleanup.sql", executionPhase = AFTER_TEST_METHOD)
      public void getEmployeeByIdAPI() throws Exception {
          // 测试逻辑
      }
      
      其中cleanup.sql包含数据清理语句,如DELETE FROM user;;
    • 方案3:通过JdbcTemplate或EntityManager在测试方法末尾手动执行清理SQL。

内容的提问来源于stack exchange,提问作者C.Unbay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:02:31