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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 03:36:20