我是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
- 方法后,我是否真的需要对睡眠定时器进行硬编码?
查看已接受答案的评论
答案 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
。