Vert.x单元测试未实现start方法的Verticle

时间:2016-11-27 15:40:00

标签: java unit-testing junit vert.x

我是Vert.x的新手,只是偶然发现了一个问题。 我有以下Verticle:

public class HelloVerticle extends AbstractVerticle {

  @Override
  public void start() throws Exception {

    String greetingName = config().getString("greetingName", "Welt");
    String greetingNameEnv = System.getenv("GREETING_NAME");
    String greetingNameProp = System.getProperty("greetingName");

    Router router = Router.router(vertx);
    router.get("/hska").handler(routingContext -> {
        routingContext.response().end(String.format("Hallo %s!", greetingName));
    });
    router.get().handler(routingContext -> {
        routingContext.response().end("Hallo Welt");
    });

    vertx
            .createHttpServer()
            .requestHandler(router::accept)
            .listen(8080);
  }
}

我想对这个Verticle进行单元测试,但我不知道如何等待Verticle的部署。

@Before
public void setup(TestContext context) throws InterruptedException {
    vertx = Vertx.vertx();
    JsonObject config = new JsonObject().put("greetingName", "Unit Test");

    vertx.deployVerticle(HelloVerticle.class.getName(), new DeploymentOptions().setConfig(config));
}

当我像这样设置我的测试时,我必须在部署调用之后添加Thread.sleep,以便在检查Verticle一段时间后执行测试。

我听说了Awaitability,并且应该可以等待使用此库部署Verticle。但我没有找到任何关于如何使用Vertx-unit和deployVerticle方法的Awaitability的例子。

有人能为此带来一些启示吗?

或者,在我的测试中调用deployVerticle - 方法后,我是否真的需要对睡眠定时器进行硬编码?

查看已接受答案的评论

1 个答案:

答案 0 :(得分:1)

首先,您需要实施start(Future future)而不是start()。然后,您需要在Handler<AsyncResult<HttpServer>> listenHandler调用中添加一个回调处理程序(listen(...)),然后通过Future解析您获得的start(Future future)

Vert.x是高度异步的 - Vert.x HTTP服务器的启动也是如此。在您的情况下,当HTTP服务器成功启动时,Verticle将完全正常运行。因此,您需要实现我上面提到的内容。

其次,您需要告诉TestContext您的Verticle的异步部署已完成。这可以通过另一个回调处理程序(Handler<AsyncResult<String>> completionHandler)完成。这是blog post显示如何做到这一点。 即使您实现了普通的start()方法,Verticle的部署也始终是异步的。因此,如果您想在测试前确定已成功部署Verticle,则应始终使用completionHandler

所以,不,你不需要,你绝对不应该在任何Vert.x应用程序中硬编码睡眠定时器。记住The Golden Rule - Don’t Block the Event Loop

修改

如果Verticle的初始化是同步的,则应覆盖普通的start()方法 - like it's mentioned in the docs

  

如果您的Verticle执行简单的同步启动,则覆盖此方法并将启动代码放在那里。

如果您的Verticle的初始化是异步的(例如,部署Vert.x HTTP服务器),您应该覆盖start(Future future)并在异步初始化完成时完成Future