vert.x消费者Verticle的start方法如何写Junit测试用例?

How to write Junit test case for start method of consumer Verticle in vert.x?

我已经实现了一个 Verticle,如下所述。 Verticle 正在按预期工作。现在我正在尝试为这个 Verticle 编写 Junit 测试用例,它可以测试启动方法、处理程序方法 handleRequest() 和处理程序内部的方法 getSomeData() returns Future。测试所有三种方法的单个测试用例或测试单个方法的单个测试用例都应该没问题。 我知道为同步代码编写 Junit 测试用例,但不知道如何在 vert.x 中为异步的 Verticle 编写 Junit TC。有人可以在这里指导我吗?我也有路由器 Verticle,我从中向这个消费者 Verticle MyVerticle 发送消息,但我想先为这个消费者 Verticle 编写 Jnuit 测试用例。请帮忙

@Component
public class MyVerticle extends AbstractVerticle{

@Override
public void start() throws Exception {
    super.start();
    vertx.eventBus().<String>consumer("address.xyz").handler(handleRequest());
}

private Handler<Message<String>> handleRequest() {
    return msg -> {
        getSomeData(msg.body().toString())
        .setHandler(ar -> {
            if(ar.succeeded()){
                msg.reply(ar.result());
            }else{
                msg.reply(ar.cause().getMessage());
            }
         });
    };
}

private Future<String> getSomeData(String inputJson) {
    Promise<String> promise = Promise.promise();
    promise.complete("Returning Data");
    return promise.future();    
 }

}

我推荐使用 vertx-unit 项目,它可以很容易地测试异步代码。对于您的特殊情况,它会像这样:

import io.vertx.core.Vertx;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(VertxUnitRunner.class)
public class MainVerticleTest {

  private Vertx vertx;

  @Before
  public void setup(TestContext ctx){
    Async async = ctx.async();
    this.vertx = Vertx.vertx();
    vertx.deployVerticle(MyVerticle.class.getName(), h -> {
      if(h.succeeded()){
        async.complete();
      }else{
        ctx.fail();
      }
    });
  }

  @Test
  public void test_consumption(TestContext ctx) {
    Async async = ctx.async();
    vertx.eventBus().request("address.xyz","message", h ->{
      if(h.succeeded()){
        ctx.assertEquals("Returning Data",h.result().body().toString());
        async.complete();
      }else{
        ctx.fail(h.cause());
      }
    });
  }
}