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
相关产品推荐
相关产品推荐

