我是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。但是我没有找到关于如何将waitx与vertx-unit和
deployVerticle
方法一起使用的任何示例。谁能对此有所启发?
还是在测试中调用
deployVerticle
-Method后真的必须对睡眠计时器进行硬编码吗?看一下已接受答案的评论
最佳答案
首先,您需要实现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的初始化是异步的(例如,部署Vert.x HTTP服务器),则应在异步初始化完成后覆盖start(Future future)
并完成Future
。