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

配置Quarkus与Bazel集成时单元测试启动失败求助

配置Quarkus与Bazel集成时的测试启动错误解决

问题现象

配置Quarkus与Bazel集成时,运行测试抛出以下错误:

java.lang.RuntimeException: io.quarkus.bootstrap.BootstrapException: Failed to create the application model for null
    at io.quarkus.test.junit.QuarkusTestExtension.throwBootFailureException(QuarkusTestExtension.java:625)
    at io.quarkus.test.junit.QuarkusTestExtension.interceptTestClassConstructor(QuarkusTestExtension.java:696)
    at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
    at org.junit.jupiter.api.extension.InvocationInterceptor.interceptTestClassConstructor(InvocationInterceptor.java:73)

基于Spring的单元测试可正常运行,当前Bazel测试配置如下:

load("@contrib_rules_jvm//java:defs.bzl", "JUNIT5_DEPS", "java_test_suite")

java_test_suite(
    name = "test",
    srcs = [
        "DataTestIT.java",
    ],
    runner = "junit5",
    test_suffixes = [
        "Test.java",
    ],
    runtime_deps = JUNIT5_DEPS + [
        artifact("io.quarkus:quarkus-bootstrap-core"),
        artifact("io.quarkus:quarkus-bootstrap-bom-test"),
        artifact("io.quarkus:quarkus-junit5"),
        artifact("io.quarkus:quarkus-junit5-mockito"),
        artifact("io.quarkus:quarkus-junit5-internal"),
    ],
    deps = [
        # internal packages
        # external deps
        artifact("io.quarkus:quarkus-junit5"),
        artifact("io.quarkus:quarkus-junit5-mockito"),
        artifact("io.quarkus:quarkus-junit5-internal"),
        artifact("io.rest-assured:rest-assured"),
        artifact("org.skyscreamer:jsonassert"),
        artifact("org.apache.httpcomponents:httpcore"),
        # mandatory
        artifact("org.junit.jupiter:junit-jupiter-api"),
        artifact("org.junit.jupiter:junit-jupiter-params"),
        artifact("org.assertj:assertj-core"),
        artifact("org.mockito:mockito-core"),
        artifact("org.mockito:mockito-inline"),
        artifact("org.mockito:mockito-junit-jupiter"),
    ],
)

已排查Quarkus 2.16版本的QuarkusTestExtension代码,调整过类路径但未解决,不想通过Maven/Gradle对比类路径,现寻求解决方案。

解决方案

1. 依赖Quarkus主应用模块

Quarkus测试扩展需要读取应用的构建模型,测试目标必须直接依赖你的Quarkus主应用目标(比如项目中定义的java_library或Quarkus专属应用目标),否则Bootstrap无法定位应用信息,出现"null"错误。

2. 补充Bootstrap核心依赖

当前配置缺少Quarkus Bootstrap构建应用模型的关键组件,需在runtime_deps中添加:

  • io.quarkus:quarkus-bootstrap-app-model:应用模型定义
  • io.quarkus:quarkus-bootstrap-runner:运行时引导组件

3. 调整Bazel测试配置示例

修改后的完整配置如下:

load("@contrib_rules_jvm//java:defs.bzl", "JUNIT5_DEPS", "java_test_suite")

java_test_suite(
    name = "test",
    srcs = [
        "DataTestIT.java",
    ],
    runner = "junit5",
    test_suffixes = [
        "Test.java",
    ],
    runtime_deps = JUNIT5_DEPS + [
        artifact("io.quarkus:quarkus-bootstrap-core"),
        artifact("io.quarkus:quarkus-bootstrap-app-model"),
        artifact("io.quarkus:quarkus-bootstrap-runner"),
        artifact("io.quarkus:quarkus-bootstrap-bom-test"),
        artifact("io.quarkus:quarkus-junit5"),
        artifact("io.quarkus:quarkus-junit5-mockito"),
        artifact("io.quarkus:quarkus-junit5-internal"),
        # 替换为你的Quarkus主应用目标路径
        "//src/main/java/com/your/project:quarkus-app",
    ],
    deps = [
        # 主应用依赖
        "//src/main/java/com/your/project:quarkus-app",
        # external deps
        artifact("io.quarkus:quarkus-junit5"),
        artifact("io.quarkus:quarkus-junit5-mockito"),
        artifact("io.quarkus:quarkus-junit5-internal"),
        artifact("io.rest-assured:rest-assured"),
        artifact("org.skyscreamer:jsonassert"),
        artifact("org.apache.httpcomponents:httpcore"),
        # mandatory
        artifact("org.junit.jupiter:junit-jupiter-api"),
        artifact("org.junit.jupiter:junit-jupiter-params"),
        artifact("org.assertj:assertj-core"),
        artifact("org.mockito:mockito-core"),
        artifact("org.mockito:mockito-inline"),
        artifact("org.mockito:mockito-jupiter"),
    ],
    # 若Bazel工作目录与Quarkus资源目录不一致,添加此参数指定配置文件路径
    jvm_flags = [
        "-Dquarkus.application.dir=src/main/resources",
    ],
)

4. 验证测试类注解

确保测试类顶部标注了@QuarkusTest注解,这是Quarkus测试扩展识别并引导应用的必要条件。


内容的提问来源于stack exchange,提问作者Roman Pertsev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:55:00