Spring Boot+TestContainers+jOOq测试插入数据不生效问题排查
以下是几个常见的原因及对应的验证、解决方法:
事务自动回滚:Spring Boot测试默认会为每个测试方法开启事务,并在测试结束后自动回滚。代码中能获取到INSERT返回的ID,是因为事务内的数据对当前连接可见,但手动查询属于外部连接,无法看到已回滚的数据。
验证/解决:在测试方法上添加@Commit注解,或在测试代码中手动提交事务后再去容器内查询;调试时可以在测试代码中设置断点,让事务处于未结束状态,此时手动查询就能看到数据。数据库/schema不匹配:虽然你拿到的凭据是test/test,但可能代码中的数据源配置连接的是TestContainers自动创建的测试专用数据库,而非你手动查询的数据库;或者jOOq配置了特定的schema,插入操作写入了其他schema而非public。
验证/解决:检查测试环境的spring.datasource.url配置,确认数据库名称;进入容器后,用psql -U test -d <数据库名>指定正确的库再查询。jOOq操作未实际执行:日志显示绑定值正确不代表SQL真的发送到了数据库执行。比如开启了批量操作但未调用
flush(),或者事务被设置为只读模式。
验证/解决:开启PostgreSQL的SQL日志(可以通过TestContainers启动容器时添加参数-c log_statement=all),查看是否有真实的INSERT语句执行记录。容器实例混淆:你调试进入的容器可能不是当前测试正在使用的实例,比如测试过程中容器重启过,你连接的是旧的已停止的容器。
验证/解决:从TestContainers的日志中获取当前运行的容器ID,再执行docker exec -it <正确ID> bash进入容器查询。
内容的提问来源于stack exchange,提问作者mpartan

