quarkus - 如何对返回 Smallrye 叛变 react 库的 Uni/Multi 的方法进行单元测试?

标签 quarkus smallrye mutiny smallrye-reactive-messaging

我在我的 Quarks 应用程序 中使用 Smallrye Mutiniy react 库,因为它在 Quarks 应用程序中得到原生支持。

我正在尝试为服务类编写单元测试。我不确定如何为返回 Uni/Multi 的方法编写单元测试。

返回 Uni<String> 的方法

public Uni<String> hello(final String name) {
    final String message = "Hello " + name;
    return Uni.createFrom().item(message);
}

为上述方法实现的单元

@Test
void testHello() {
    final Uni<String> casePass = hello("Ram");
    // assertion passes and all good with this.
    casePass.subscribe().with(message -> Assertions.assertEquals("Hello Ram", message));
    
    final Uni<String> caseFail = hello("Ravan");
    //  It is expected to fail the assertion, and it does. But the test is not failing, instead aseertion fail message simply logged to the console.
    caseFail.subscribe().with(message -> Assertions.assertEquals("Hello Sita", message));
}

控制台日志

[-- Mutiny had to drop the following exception --]
Exception received by: io.smallrye.mutiny.helpers.UniCallbackSubscriber.onItem(UniCallbackSubscriber.java:71)
org.opentest4j.AssertionFailedError: expected: <Hello Sita> but was: <Hello Ram>
    at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55)
    at org.junit.jupiter.api.AssertionUtils.failNotEqual(AssertionUtils.java:62)
    at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:182)
    at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:177)
    at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:1124)
...

最佳答案

有几种方法。您可以使用 smallrye.io/smallrye-mutiny/guides/testing 中提供的实用方法。但是,如果根据您的评论,您需要更多,我建议采用以下方法:

final Uni<Greeting> casePass = hello("Ram");
Greeting g = casePAss.await().atMost(Duration.ofSeconds(5)); // To be sure we don't stay tucked
// Assertions come here

所以基本上,您阻止直到项目被发送。避免使用 await().indefinitely(),因为如果 Uni 从不发送项目,它可能会阻止您的测试。如果 Uni 发送失败,await()... 不会抛出异常。

关于quarkus - 如何对返回 Smallrye 叛变 react 库的 Uni/Multi 的方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68330665/

相关文章:

quarkus - 响应式(Reactive) Mutiny 代码中是否有有效的 Quarkus OpenTelemetry 支持?

java - 有没有办法在 Quarkus 单元测试中回滚事务?

quarkus - Mutiny - 根据业务逻辑结合 Uni 和 Multi

java - 我如何在 smallrye mutiny 中对 Multi 进行排序

java - 两个 Quarkus 服务之间的非阻塞数据流(Vert.x with Mutiny in Java)

logging - 如何使用 Quarkus 拦截日志消息以进行测试

unit-testing - 如何覆盖 Quarkus 中一个 Unittest 的配置属性

java - Quarkus 验证来自多个来源的 JWT

reactive-programming - Vertx 在 Quarkus vertx mutiny webclient 扩展中不可用