如何用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
相关产品推荐
相关产品推荐

