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

如何对包含vertx()的方法进行单元测试。eventBus()。发送()?

郑宜民
2023-03-14

令人沮丧的。我到处都能看到测试异步Vertx代码的示例,但没有任何内容接近我要测试的内容。

  • Vertx 3.3.2,JUnit 4.12,Java8

被测试的方法向事件总线发送消息。我想验证在eventBus()中发生的事情。发送()响应处理程序正在发生。

所以,我看到的许多例子在TEST ITSELF中有eventBus()。发送()方法(因此,测试事件总线的另一端——消费者)我想测试。发送()中的响应处理程序

我在测试中尝试了异步。尝试ArgumentCaptor。尝试Thread.sleep()。尝试do答案()。似乎没有什么可以让测试(a)等待异步事件Bus()。发送()在测试的方法中调用完成,并且(b)能够验证()有交互(我认为这可能与Vertx之间的不同有关...TestContext和JUnit。运行上下文...(

代码:测试方法:

public void sendToEventBusAddress(RoutingContext context, String requestId, String userId) {
    List<String> stuff = split(context.request().getParam("stuffToSplit"));
    JsonObject eventBusMessage = new JsonObject()
            .put("requestId", requestId)
            .put("stuffList", new JsonArray(stuff))
            .put("userId", userId);
    LOGGER.info("Putting message: {} onto the EventBus at address: {}", eventBusMessage.encodePrettily(), EventBusEndpointEnum.STUFF_ACCESS.getValue());
    context.vertx().eventBus().send(EventBusEndpointEnum.STUFF_ACCESS.getValue(), eventBusMessage, new DeliveryOptions().setSendTimeout(timeout), async -> {
        if (async.succeeded()) {
            LOGGER.info("EventBus Response: {}", async.result().body().toString());
            context.response().setStatusCode(HttpStatus.SC_OK);
            context.response().headers().set(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN);
            context.response().end(async.result().body().toString());
        } else {
            LOGGER.error(errorMessage);
            context.response().setStatusCode(HttpStatus.SC_BAD_REQUEST);
            context.response().end(errorMessage);
        }
    });
}

简化(非工作)测试用例和类:

@RunWith(VertxUnitRunner.class)
public class MyBrokenTest {
    @Mock private RoutingContext routingContext;
    @Mock private HttpServerRequest contextRequest;
    @Mock private HttpServerResponse contextResponse;
    @Mock private MultiMap responseHeaders;

    @Rule public RunTestOnContext rule = new RunTestOnContext();

    @Before
    public void setUp(TestContext context) {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testOne(TestContext context) {
        when(routingContext.vertx()).thenReturn(rule.vertx());
        when(routingContext.request()).thenReturn(contextRequest);
        when(contextRequest.getParam("stuffToSplit")).thenReturn("04MA");
        when(routingContext.response()).thenReturn(contextResponse);
        when(contextResponse.headers()).thenReturn(responseHeaders);

        rule.vertx().eventBus().consumer(EventBusEndpointEnum.STUFF_ACCESS.getValue(), res -> {
            res.reply("yo");
        });

        ClassUnderTest cut= new ClassUnderTest(180000);
        cut.sendToEventBusAddress(routingContext, "testRequestId", "UnitTestId");
        verify(contextResponse).setStatusCode(200);
    }
}

我知道当前形式的测试不起作用,因为在测试中的方法一旦在方法内部调用eventBus()。发送()方法就会返回,因此,验证失败,没有交互。

我不明白的是,鉴于Vertx的异步特性,如何正确地验证它!

谢谢

共有1个答案

江温书
2023-03-14

我这样做了:

>

@beforeach-我为给定的消息创建一个消费者,并将消息存储到变量/集合中

比如:

receivedMessage = new Message[1];
   eventBus.consumer("DB",
        message -> {
            message.reply("OK");
            receivedMessage[0] = message;
        });
context.completeNow();

在测试中,我验证存储值:

client.get(8080, "localhost", "/user/" + id)
    .as(BodyCodec.string())
    .send(context.succeeding((response -> context.verify(() -> {
        Assertions.assertEquals(expectedMessage, receivedMessage[0].body());
        context.completeNow();
}))));
 类似资料:
  • 我陷入了单元测试场景的一个基本问题,并将感谢帮助。 我有一个类,它调用在DB中将标志设置为true。 我的测试: 我被要求测试并检查是否正在使用相关数据调用。 由于返回类型无效,我如何测试它?

  • 本文向大家介绍对 Vue-Router 进行单元测试的方法,包括了对 Vue-Router 进行单元测试的方法的使用技巧和注意事项,需要的朋友参考一下 由于路由通常会把多个组件牵扯到一起操作,所以一般对其的测试都在 端到端/集成 阶段进行,处于测试金字塔的上层。不过,做一些路由的单元测试还是大有益处的。 对于与路由交互的组件,有两种测试方式: 使用一个真正的 router 实例 mock 掉 $r

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样:

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

  • 我有一个触发器,当opportunity更新时触发,作为其中的一部分,我需要调用我们的API,并提供opportunity的一些详细信息。 根据Web上的许多建议,我创建了一个类,其中包含一个@Future方法来制作标注。 我试图捕获在@future方法中抛出的异常,但测试方法没有看到它。 测试中的类如下所示: 下面是单元测试: 现在,我已经读到,测试@future方法的方法是用测试来围绕调用。s

  • 我有一个helper类,它包含一个公共静态方法: 一个定制服务类使用上面的ProductHandlerManager: 我想在自定义服务类中使用单元测试方法。我尝试使用mockito模拟测试中的部分,但是mockito不支持静态方法模拟。那么我如何使用mockito来单元测试函数呢? 请不要建议我使用Powermock,因为我读过一些文章,说如果我需要模拟静态方法,这表明设计不好。但是我可以接受关