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
相关产品推荐
相关产品推荐

