微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何对返回 Smallrye 叛变反应库的 Uni/Multi 的方法进行单元测试?

我在我的 Quarks 应用程序中使用 Smallrye Mutiniy 反应库,因为 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()... 不会抛出异常。

,

我真的建议使用 SmallRey 的测试方式。

https://smallrye.io/smallrye-mutiny/guides/testing

您仍然可以从 multi/uni 中取出对象 例如,使用调用。

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

@Test
public void testUnit() {
    UniAssertSubscriber<String> tester = hello("someone")
            .invoke( i -> Assertions.assertEquals("Hello someone",i))
            .invoke(i -> Assertions.assertNotNull(i))
            .subscribe().withSubscriber(UniAssertSubscriber.create());
    tester.assertCompleted();
}

@Test
public void secondUnit() {
    UniAssertSubscriber<String> tester = hello("none")
            .invoke( i -> Assertions.assertEquals("Hello someone",i))
            .invoke(i -> Assertions.assertNotNull(i))
            .subscribe().withSubscriber(UniAssertSubscriber.create());
    tester.assertCompleted();
}

希望你可以这样使用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?