You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Vert.x编写API集成测试?测试端点未调用问题排查

排查Vert.x API测试无法调用/api/user端点的问题

1. 测试未等待Verticle启动完成

你的测试代码直接发起HTTP请求,但ServiceVerticle的start方法中,httpServer.listen()是异步操作,测试可能在服务器还未完全启动时就发送请求,导致连接失败或无响应。

解决方法:
在测试类的@Before方法中部署Verticle并等待启动完成:

@Before
public void setUp() {
    Async async = context.async();
    vertx.deployVerticle(new ServiceVerticle(), res -> {
        if (res.succeeded()) {
            async.complete();
        } else {
            context.fail(res.cause());
        }
    });
}

2. HttpClient请求未实际发送

第一个测试dummyTestCase调用client.request()后,没有调用end()或send()方法发送请求,导致请求根本没发出去;第二个测试getUsers使用的旧版Vert.x HttpClient的get方法,同样需要调用end()完成请求发送。

修正第一个测试:

@Test
public void dummyTestCase() {
    System.out.println(" dummyTestCase ");
    Async async = context.async();
    HttpClient client = vertx.createHttpClient();
    client.request(HttpMethod.GET, 8080, "localhost", "/api/user")
            .onSuccess(request -> {
                request.send().onSuccess(response -> {
                    System.out.println(" dummyTestCase inside ");
                    context.assertEquals(response.statusCode(), 200);
                    async.complete();
                }).onFailure(context::fail);
            }).onFailure(context::fail);
}

修正第二个测试(适配Vert.x 3.x版本):

@Test
public void getUsers() {
    System.out.println("Inside getusers ");
    Async async = context.async();
    vertx.createHttpClient().get(8080, "localhost", "/api/user", 
            response -> {
                    System.out.println("Inside vertx");
                    context.assertEquals(response.statusCode(), 200);
                    context.assertEquals(response.headers().get("content-type"), "application/json");
                    response.bodyHandler(body -> {
                        context.assertTrue(body.toString().contains("Collection"));
                        async.complete();
                    });
            }).end(); // 调用end()发送请求
}

3. 认证拦截器的拦截

如果authentication.bypass配置为false,router.route("/api/*")会应用JWTAuthHandler,但测试请求未携带有效JWT Token,会被拦截返回401,导致断言失败。

解决方法:

  • 测试时将authentication.bypass设为true绕过认证:
@Before
public void setUp() {
    Async async = context.async();
    JsonObject config = new JsonObject().put("authentication.bypass", true);
    vertx.deployVerticle(new ServiceVerticle(), new DeploymentOptions().setConfig(config), res -> {
        if (res.succeeded()) {
            async.complete();
        } else {
            context.fail(res.cause());
        }
    });
}
  • 或者在测试请求的请求头中添加有效JWT Token。

4. 服务器端口与地址验证

检查是否有其他进程占用8080端口,同时可以在ServiceVerticle的listen回调中打印实际启动端口,确保端口配置正确:

httpServer.requestHandler(router::accept).listen(res -> {
    if (res.succeeded()) {
        logger.info("Service verticle started on port {}", res.result().actualPort());
    } else {
        logger.error("Failed to start server", res.cause());
    }
});

内容的提问来源于stack exchange,提问作者AnilSrinivas Muddineni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:53:10