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 FROMuser;; - 方案3:通过JdbcTemplate或EntityManager在测试方法末尾手动执行清理SQL。
- 方案1:给测试方法添加
内容的提问来源于stack exchange,提问作者C.Unbay
相关产品推荐
相关产品推荐

