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

如何使用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,按以下顺序排查:

  1. 检查数据库配置(URL、用户名、密码、驱动类)是否正确,确认数据库服务正常运行
  2. 查看控制台是否有数据库连接相关的错误日志
  3. 在连接池初始化后,先调用getConnection验证连接是否能正常获取

内容的提问来源于stack exchange,提问作者Mattia Dinosaur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:22:43