当前位置: 首页 > 知识库问答 >
问题:

如何单元测试方法返回Uni/多小兵变反应库?

曹经业
2023-03-14

我在Quarks应用程序中使用Smallrye Mutiniy反应库,因为它在Quarks应用程序中本机受支持。

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

一种返回Uni的方法

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)
...

共有2个答案

慕承恩
2023-03-14

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

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

例如,您仍然可以从multi/uni-use调用中获取对象。

 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();
}

我希望你能像那样使用它

程鸿畅
2023-03-14

有几种方法。您可以使用smallrye中提供的实用程序方法。io/smallrye叛变/指南/测试。然而,根据您的评论,如果您需要更多,我建议您采用以下方法:

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

因此,基本上,您会一直阻止,直到项目被发送。避免等待()。无限期()。不是等待() 将引发异常

 类似资料:
  • Java 8,但这是一个通用的单元测试问题,它(很可能)是与语言无关的。 编写JUnit测试的语法很容易,但是决定要编写什么测试以及如何测试主/生产代码是我发现的最大挑战。在阅读单元测试最佳实践时,我一遍又一遍地听到同样的事情: 测试合同 我相信这个想法是,单元测试不应该是脆弱的,如果方法的实现发生变化,它不应该被破坏。该方法应定义输入的协定 - 假设我有以下方法: 所以在这里,我们有一个方法,我

  • 当我到达endpoint时,我会得到这个资源: 这是我的代码: 这些是我的quarkus项目依赖项: 有什么想法吗?

  • 测试方法: 测试用例:

  • 我正在我的项目中使用spring webflux。我的controller类调用返回Mono或Flux的服务类方法。 我正在尝试为我的服务类编写单元测试。我不确定如何为返回mono/flux的方法编写单元测试。我查看的大多数文章都建议我使用WebClientTest。但重点是,我在这里测试我的服务类。当我通过模拟服务类方法测试我的web层(控制器类)时,我使用了WebclientTest。 对如何

  • 问题内容: 如果我有这样的控制器: 基本上,我从存储库中获取东西,然后将其投影到匿名类型中。 如何进行单元测试? 有一个名为的属性,但它的类型与我们预期的一样。 这是否意味着如果我想测试JSON对象是否具有我期望的属性(“ id”,“ name”,“ type”),我是否必须使用反射? 编辑: 这是我的测试: 但是我在循环中收到一个运行时错误,指出“对象不包含id的定义”。 当我将断点定义为匿名类

  • 从一个夸克斯(kotlin)应用程序中,我并行请求多个endpoint(相同的endpoint,但有不同的基本网址),然后我合并uni,以便不依次等待每个响应。 以下是一个示例: 我遇到的问题是,在超时的情况下不使用。如果单个uni需要超过1毫秒(此值仅用于测试...),则最后一个块将在处抛出TimeoutExc0019。 我想在单个uni级别处理超时,并且将此错误视为失败(并记录和恢复)。但这似