如何使用JUnit在Vert.x中测试数据库查询?
解决Vert.x JUnit测试中数据库查询回调不执行的问题
你的代码只打印a不执行b的核心原因有两个:
- 依赖
Thread.sleep无法可靠等待异步回调完成,且若数据库连接失败,回调根本不会触发 - 未利用Vert.x测试框架的异步控制机制,测试线程可能在回调执行前就已结束
正确的测试写法(JUnit 4 + Vert.x Unit)
@RunWith(VertxUnitRunner.class) public class TestMainVerticle { Vertx vertx; JDBCPool pool; // 测试前初始化资源 @Before public void setUp(TestContext context) { vertx = Vertx.vertx(); var config = MainVerticle.getDbConfig(); pool = JDBCPool.pool(vertx, config); // 提前验证连接池是否能正常获取连接 pool.getConnection(context.asyncAssertSuccess(conn -> conn.close())); } @Test public void testDatabaseQuery(TestContext context) { // 创建异步标记,通知测试框架等待回调完成 Async async = context.async(); System.out.println("a"); pool.query("select 1 from test").execute(event -> { if (event.succeeded()) { System.out.println("b"); // 验证查询结果 ResultSet result = event.result(); context.assertEquals(1, result.size()); // 标记异步操作完成 async.complete(); } else { // 打印错误信息,快速定位问题 System.err.println("查询失败: " + event.cause().getMessage()); context.fail(event.cause()); async.complete(); } }); } // 测试后清理资源 @After public void tearDown(TestContext context) { pool.close(); vertx.close(context.asyncAssertSuccess()); } }
关键改进点
- 用
@Before/@After统一初始化、清理Vertx实例和数据库连接池,避免重复代码 - 替换
Thread.sleep为TestContext.async(),确保测试等待异步回调执行完毕 - 添加错误处理逻辑,打印失败原因,快速排查数据库连接或查询问题
- 初始化阶段验证连接池可用性,提前发现配置错误
如果你使用Vert.x JUnit 5
基于JUnit 5的Vert.x测试写法如下:
@ExtendWith(VertxExtension.class) public class TestMainVerticle { @InjectVertx Vertx vertx; JDBCPool pool; @BeforeEach void setUp() { var config = MainVerticle.getDbConfig(); pool = JDBCPool.pool(vertx, config); } @Test void testDatabaseQuery(VertxTestContext testContext) { System.out.println("a"); pool.query("select 1 from test").execute(event -> { if (event.succeeded()) { System.out.println("b"); testContext.verify(() -> assertEquals(1, event.result().size())); testContext.completeNow(); } else { testContext.failNow(event.cause()); } }); } @AfterEach void tearDown(VertxTestContext testContext) { pool.close(); vertx.close(testContext.succeedingThenComplete()); } }
额外排查步骤
若仍未执行到b,按以下顺序排查:
- 检查数据库配置(URL、用户名、密码、驱动类)是否正确,确认数据库服务正常运行
- 查看控制台是否有数据库连接相关的错误日志
- 在连接池初始化后,先调用
getConnection验证连接是否能正常获取
内容的提问来源于stack exchange,提问作者Mattia Dinosaur
相关产品推荐
相关产品推荐

