如何在Spring Boot集成测试中回滚data.sql脚本修改?
Spring Boot集成测试数据修正后回滚方案
核心方案:事务包裹测试全流程
直接利用Spring测试的事务机制,把data.sql的修正操作和测试逻辑都套在一个事务里,测试结束自动回滚,完全不改动原有数据库数据。
具体操作
- 给测试类添加事务注解
在你的@SpringBootTest测试类上加上@Transactional和@Rollback:
@SpringBootTest @Transactional @Rollback public class YourTestClass { // 测试方法写在这里 }
@Transactional:让测试类的所有方法都运行在独立事务中@Rollback:强制测试结束后回滚事务(Spring Boot测试默认就是回滚,显式标注更清晰)
- 确保data.sql在事务内执行
Spring Boot 2.0.x中,data.sql默认在上下文初始化时执行,此时还未进入测试事务。需要调整配置,让脚本在事务启动后运行。在测试专用的application-test.yml中添加:
spring: sql: init: mode: always datasource: driver-class-name: oracle.jdbc.OracleDriver url: ${URL} username: ${USERNAME} password: ${PASSWORD} continue-on-error: true
这样data.sql里的UPDATE语句会被包含在测试事务中,测试结束后自动回滚,原有数据库的null值不会被改动。
备用方案:用视图屏蔽脏数据
如果事务方案遇到Oracle兼容性问题(比如某些特殊表不支持事务回滚),可以直接创建视图处理null值:
CREATE OR REPLACE VIEW my_table_view AS SELECT id, NVL(my_column, 0) AS my_column, other_columns FROM my_table;
测试代码里直接查询这个视图,不用修改原表数据,也就不存在回滚的问题。
内容的提问来源于stack exchange,提问作者Andrei Manolache
相关产品推荐
相关产品推荐

