gpt4 book ai didi

java - 如何在不发送回复的情况下测试异步顶点事件总线处理程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:23 25 4
gpt4 key购买 nike

我有两个用 java vertx 编写的微服务。他们通过事件总线进行通信。第一个发送消息,第二个接收消息。

第一个想法:在单元测试中只回复 Vertx 事件总线消息。

我想测试消息的处理是否没有错误,因此我在检查回复的第二个微服务上编写了单元测试

eventbus.send("address", message, reply -> {
if (reply.succeeded()) {
context.async().complete();
} else {
context.fail();
}});

现在我必须在我的消费者中发送回复,但我只想在测试中这样做,我不需要在生产中发送回复。我不想消耗 cpu 和网络在生产中发送回复。所以我正在寻找的是这样的东西:

vertx.eventBus().consumer("address", handler -> {
Boolean success = methodMayFail();
if ( MY_CONTEXT_IS_TEST || HANDLER_IS_LOCAL_AS_I_ONLY_SENT_LOCAL_MESSAGES_FROM_TEST) {
success ? handler.reply("ok") : handler.fail();
}
});

第二个想法是在cdelmas comment之后出现的并且在 my own answer

最佳答案

要在没有回复的情况下测试异步事件总线处理程序,您必须将业务逻辑提取到服务中并将测试用例分成两部分。首先用于消息传递,其次用于业务逻辑。

ConsumerVerticle 看起来像这样:

class ConsumerVerticle extends AbstractVerticle {
// this service is injected somehow, for example as constructor parameter
private MyService service;
...
public void start() {
vertx.eventBus().consumer("address", handler -> {
service.methodMayFail();
});
}
}

在异步测试中,使用将保持异步的覆盖方法 methodMayFail() 实现您的服务的模拟

class MockService extends MyService() {
private Async async;
public MockService(Async async) {
this.async = async;
}
@Override public void methodMayFail() {
async.complete()
}
}

然后将模拟服务注入(inject)verticle

MockService service = new MockService(context.async()); 
ConsumerVerticle consumerVerticle = new ConsumerVerticle(service);
...
eventbus.send("address", message)

在另一个类 MyServiceTest 的某处测试 methodMayFail() 的实现。

关于java - 如何在不发送回复的情况下测试异步顶点事件总线处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36176660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com