vertx.createHttpClient().getNow() 未调用处理程序

vertx.createHttpClient().getNow() not invoking the handler

我有以下测试方法:

private Vertx vertx;

@Before
public void setUp(TestContext context) throws IOException {
    vertx = Vertx.vertx();
    vertx.deployVerticle(MainVerticle.class.getName(), context.asyncAssertSuccess());
}

@After
public void tearDown(TestContext context) {
    vertx.close(context.asyncAssertSuccess());
}

@Test
public void serverIsStarted(TestContext context) {
    vertx.createHttpClient().getNow(8080, "localhost", "/inexistent", response -> {
        System.out.println("Handler running");
        Assert.assertEquals(response.statusCode(), 200);
        context.assertEquals(response.statusCode(), 200);
    });
    System.out.println("Done");
}

摘自 this sample repo。然而,它并没有真正做任何事情。路径 inexistent 不存在,即使我删除了 setUp 中启动服务器的代码,测试仍然通过。此外,文本 "Handler running" 未打印,仅打印 "Done".

我错过了什么,为什么它什么都不做?

请记住,请求是异步处理的。您遇到的是测试 运行 在可以处理带有结果的异步回调之前完成。

根据 docs,您应该做的是创建一个 Async 实例,以向测试运行器发出信号以保持测试 运行 直到调用 complete()在那个 Async 实例上,像这样:

@Test
public void serverIsStarted(TestContext context) {
    final Async async = context.async(); // <-- create the Async instance

    vertx.createHttpClient().getNow(8080, "localhost", "/inexistent", response -> {
        context.assertEquals(200, response.statusCode());

        async.complete();  // <-- signal this test can now terminate
    });
}

此外,仅供参考 - 您的参数 assertEquals() 向后:

  • 第一个参数为期望值
  • 第二个参数为实际值

希望对您有所帮助!