Quarkus应用API测试:持久化数据库条目调用后无法获取
问题原因分析
核心问题是测试方法内的事务与HTTP请求的事务完全独立:
- 调用
service.createCompany()时,代码运行在@TestTransaction管理的测试事务中,这个事务默认不会自动提交(直到测试方法结束才会处理,默认行为是回滚)。 - 而
given().when().get("/1")发起的HTTP请求是一个独立的请求,会开启全新的事务,根本看不到测试事务中未提交的数据——哪怕日志显示对象已被分配ID=1,这条数据还处于测试事务的未提交状态,对外不可见。
解决方案
方案1:手动提交测试事务
在创建对象后,手动提交当前测试事务,让数据对其他事务可见:
@Inject TransactionManager transactionManager; @Test void test_getCompanyThatExist() throws SystemException { service.createCompany(createCompany()); // 手动提交事务,使数据对外可见 transactionManager.commit(); given() .when().get("/1") .then().statusCode(200) .body("size()", is(1)); }
方案2:修改@TestTransaction的执行模式
将@TestTransaction的模式设置为COMMIT,让测试方法的事务在执行过程中提交,而非默认的回滚:
@TestTransaction(Mode.COMMIT) @Test void test_getCompanyThatExist() { service.createCompany(createCompany()); given() .when().get("/1") .then().statusCode(200) .body("size()", is(1)); }
额外验证点
- 确认
CompanyService.createCompany()方法已标注@Transactional,确保创建操作在事务上下文内执行。 - 检查
repository.findById(id)的实现逻辑,确认它是正确从数据库查询(而非仅从缓存获取)。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

