繁体   English   中英

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

[英]Vert.x Unit Test a Verticle that does not implement the start method with future

我是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));
}

当我像这样设置测试时,我必须在deploy调用之后添加Thread.sleep ,以使测试在经过一定时间后才执行。

我听说了可等待性,应该有可能等待该库部署Verticle。 但是我没有找到有关如何将Awaitability与vertx-unit和deployVerticle方法一起使用的任何示例。

谁能对此有所启发?

还是在测试中调用deployVerticle之后, deployVerticle真的必须对睡眠计时器进行硬编码?

看一下已接受答案的评论

首先,您需要实现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 )来Handler<AsyncResult<String>> completionHandler 这是博客文章,展示了如何做到这一点。 即使您实现了普通的start()方法,Verticle的部署也始终是异步的。 因此,如果要确保在测试之前成功部署了Verticle,则应始终使用completionHandler

因此,不需要,您绝对不应该在任何Vert.x应用程序中对睡眠计时器进行硬编码。 注意黄金法则-不要阻塞事件循环

编辑:

如果Verticle的初始化是同步的,则应覆盖普通的start()方法- 就像docs中提到的那样

如果您的立式计算机执行简单的同步启动,则覆盖此方法并将启动代码放入其中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM