我正在尝试在 quarkus 2.2 上测试一些用 mutiny 实现的反应性代码。这段代码做一些 sql 查询,我想要一个事务方法。
据我所知,为了测试响应式代码,我必须明确地等待结果。但是当有事务时,我得到一个 io.quarkus.runtime.BlockingOperationNotAllowedException: Cannot start a JTA transaction from the IO thread。
这里是测试:
void myTest() throws InterruptedException, SystemException, NotSupportedException {
final Prestation prestation = Prestation.builder().build();
final Uni<Uni<Integer>> uniUni = Uni.createFrom().voidItem().onItem().transformToUni(unused -> prestationCreate.upsert(prestation)).onItem()
.transformToUni(aBoolean -> {
return prestationClosedThePreviousDaySelect.select2Multi(LocalDate.of(2021, 04, 29))
.collect().asList();
})
.onItem()
.transformToUni(prestations -> Uni.createFrom().item(prestationRepository.deleteAll()))
.runSubscriptionOn(Infrastructure.getDefaultExecutor());
final UniAssertSubscriber<Uni<Integer>> uniUniAssertSubscriber = uniUni.subscribe().withSubscriber(UniAssertSubscriber.create());
uniUniAssertSubscriber.awaitItem()
.assertCompleted();
}
使用此代码,异常将在最后一行抛出。
如果我用 listUniAssertSubscriber.assertCompleted(); 替换最后一行,测试将失败并显示“预期完成事件,但未收到它”。
有人知道是否有办法用事务测试反应性代码?