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

TransactionalUniAsserter的Panache响应式测试未执行问题排查

问题分析:TransactionalUniAsserter测试未触发预期失败

问题现象

在Quarkus 3.3.1环境下编写Panache响应式实体测试时:

  • 使用TransactionalUniAsserter的测试用例,预期会失败但实际通过,疑似测试逻辑未被调度执行
  • 使用默认UniAsserter的测试用例则能正常触发预期失败

示例测试代码

import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.vertx.UniAsserter;
import io.quarkus.test.vertx.TransactionalUniAsserter;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.fail;

@QuarkusTest
public class MyEntityTest {

    // 此测试本该失败却成功(错误用法)
    @Test
    void testWithTransactionalAsserterWrongUsage(TransactionalUniAsserter asserter) {
        // 错误:直接返回Uni,未通过TransactionalUniAsserter的方法调度执行
        MyEntity.persist(new MyEntity("test")).invoke(() -> {
            fail("This should fail the test");
        });
    }

    // 此测试能正常失败(默认UniAsserter正确用法)
    @Test
    void testWithDefaultUniAsserter(UniAsserter asserter) {
        asserter.execute(() -> 
            MyEntity.persist(new MyEntity("test")).invoke(() -> {
                fail("This should fail the test");
            })
        );
    }

    // 修正后的TransactionalUniAsserter测试,能正常失败
    @Test
    void testWithTransactionalAsserterCorrectUsage(TransactionalUniAsserter asserter) {
        asserter.execute(() -> 
            MyEntity.persist(new MyEntity("test")).invoke(() -> {
                fail("This should fail the test");
            })
        );
    }
}

相关POM配置(基于Quarkus 3.3.1 BOM)

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-bom</artifactId>
            <version>3.3.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-resteasy-reactive</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-panache-mongodb-reactive</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-junit5</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-test-vertx</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

问题原因

核心原因是**TransactionalUniAsserter的用法错误**:

  • TransactionalUniAsserter需要通过其提供的execute、assertThat等方法包裹响应式逻辑,这些方法会负责绑定事务上下文、订阅Uni并等待其执行完成
  • 如果直接在测试方法中返回Uni而不通过TransactionalUniAsserter的方法提交,Quarkus测试框架不会处理这个Uni,导致响应式任务从未被订阅执行,断言代码自然不会触发,测试也就意外通过
  • 默认UniAsserter的测试用例因为正确使用了execute方法,Uni被正常订阅执行,断言触发了预期失败

解决方案

确保所有需要在事务上下文执行的响应式逻辑,都通过TransactionalUniAsserter的execute或其他相关方法提交,示例见上面的testWithTransactionalAsserterCorrectUsage方法。

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:51:27