1

我已经实现了一个 Verticle,如下所述。Verticle 按预期工作。现在我正在尝试为这个 Verticle 编写 Junit 测试用例,它可以测试 start 方法、处理程序方法 handleRequest() 以及返回 Future 的处理程序内部的方法 getSomeData()。测试所有三种方法的单个测试用例或测试单个方法的单个测试用例都应该没问题。我知道为同步代码编写 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();    
 }

}

4

1 回答 1

1

我推荐使用 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());
      }
    });
  }
}

于 2019-12-09T09:29:23.720 回答