![](/img/trans.png)
[英]Is it correct to test assertions on a Uni running subscription on another thread in Mutiny?
[英]Uni subscription not running when using retry policy
我在 Quarkus 上使用 Mutiny 时遇到了一些奇怪的行为。
我的问题是我试图将现有方法包装到 Uni 中,并且我希望此方法重试一定次数,如果它们都失败,我希望调用我的失败订阅,但事实并非如此。
为了更好地理解这一点,我为它写了一个测试:
@Test
void mutinySubscriptionNotCalledAfterRetry() {
final AtomicBoolean executed = new AtomicBoolean(false);
Uni.createFrom().item(this::error)
.onFailure()
.retry()
.withBackOff(Duration.ofSeconds(1)).withJitter(0.2)
.atMost(5)
.subscribe()
.with(success -> fail(),
failure -> executed.set(true));
assertTrue(executed.get()); // Failing statement
}
private boolean error() {
throw new RuntimeException();
}
问题是失败订阅从未运行过,我不知道我是否没有理解某些东西,但是根据 Clement 的操场,这似乎是一个有效的用例:
https://gist.github.com/cescoffier/e9abce907a1c3d05d70bea3dae6dc3d5
任何人都可以对此有所了解吗?
非常感谢。
用例完全有效,但您的测试未正确编写。 这种类型的重试是异步的。 因此,执行断言时尚未调用失败回调( failure -> execute(set(true));
)。 你需要等到它被调用。 在您的情况下,大约需要 35 秒。
要等待,您可以使用Awaitility并执行以下操作: await().until(() -> executed.get());
execution.get await().until(() -> executed.get());
. 您还可以使用io.smallrye.mutiny.helpers.test.UniAssertSubscriber
:
@Test
void mutinySubscriptionNotCalledAfterRetry() {
UniAssertSubscriber<Boolean> subscriber =
Uni.createFrom().item(this::error)
.onFailure().retry()
.withBackOff(Duration.ofSeconds(1)).withJitter(0.2)
.atMost(5)
.subscribe().withSubscriber(new UniAssertSubscriber<>());
subscriber.awaitFailure(Duration.ofSeconds(35));
}
private boolean error() {
throw new RuntimeException("boom");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.