配置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
相关产品推荐
相关产品推荐

