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

Spring Boot集成测试H2数据库数据读取失败问题排查

问题根源与修复方案

1. 核心问题:表名不匹配

你的UserEntity通过@Table指定的表名是**users**(复数),但SQL脚本里插入的是user表(单数)。即便schema配置正确,数据也插错了表,自然查询返回空列表。

2. Schema引用语法错误

H2数据库中,指定schema下的表时,正确写法是**main.users**(分别为schema和表名添加反引号)。你之前写的main.users会被H2识别为一个完整的表名(而非main schema下的users表),因此触发“表不存在”的报错。


具体修复步骤

步骤1:修正SQL脚本

修改getUsers_shouldOk.sql内容,确保表名匹配且schema引用正确:

-- 写法1:明确指定schema和表
INSERT INTO `main`.`users` (`id`, `name`) VALUES (1, 'user-01');
INSERT INTO `main`.`users` (`id`, `name`) VALUES (2, 'user-02');
INSERT INTO `main`.`users` (`id`, `name`) VALUES (3, 'user-03');

-- 写法2:先切换默认schema,再插入(更简洁)
SET SCHEMA main;
INSERT INTO users (id, name) VALUES (1, 'user-01');
INSERT INTO users (id, name) VALUES (2, 'user-02');
INSERT INTO users (id, name) VALUES (3, 'user-03');

步骤2:补充Service缺失方法

你的UserServiceImpl未实现测试中调用的getAll()方法,需补充:

@Override
public List<UserEntity> getAll() {
    return userRepository.findAll();
}

步骤3:处理事务回滚(可选)

测试方法上的@Transactional会让Spring在测试结束后自动回滚事务,若想验证数据是否真的插入成功:

  • 给测试方法添加@Commit注解禁用回滚;
  • 或者直接移除测试方法上的@Transactional(服务层已标注该注解,测试层无需重复添加)。

额外验证建议

添加H2控制台配置,可直观查看数据库数据:

spring:
  h2:
    console:
      enabled: true
      path: /h2-console

启动测试后访问http://localhost:随机端口/h2-console,用配置的JDBC URL连接,检查main schema下的users表是否有数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:25:22