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

@QuarkusTest测试时自定义@QuarkusMain主类未执行问题咨询

Quarkus @QuarkusTest 不触发自定义@QuarkusMain主类问题解答

核心结论

该现象是Quarkus框架的设计特性,不属于Bug。
@QuarkusTest的设计逻辑是直接初始化CDI运行上下文,默认跳过用户自定义主类入口,目的是隔离生产环境启动逻辑与测试环境,避免主类中的阻塞逻辑、外部依赖调用等影响测试用例的稳定性和执行效率。

适配方案

方案1:公共初始化逻辑迁移到CDI启动事件监听(推荐)

将自定义主类中时区设置、Camel集成等公共初始化逻辑,迁移到CDI StartupEvent 监听方法中,该方法会在生产启动、测试启动两个场景下都会自动触发,无需依赖主类调用,适配性最强。
示例代码:

import io.quarkus.runtime.StartupEvent;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import java.util.TimeZone;

@ApplicationScoped
public class GlobalInitializer {
    // 上下文初始化完成后自动执行
    void init(@Observes StartupEvent event) {
        // 原自定义主类中的初始化逻辑挪到此处
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
        // Camel集成初始化逻辑
    }
}

调整后你可以保留原有的@QuarkusMain自定义主类,生产启动、测试启动的公共逻辑会统一执行,不会出现逻辑不一致的问题。

方案2:指定测试环境启动主类

如果确实需要保留自定义主类的执行逻辑、不想调整原有代码结构,可以在application.properties中添加配置,强制测试环境调用你的自定义主类:

# 替换为你自定义主类的全限定名
quarkus.test.main-class=com.example.YourCustomMain

注意:该方案需要确保自定义主类中没有生产环境专属的阻塞逻辑(如独立端口监听、后台常驻线程启动等),否则会导致测试启动失败或卡住。

版本适配说明

以上两种方案均兼容你当前使用的Quarkus 2.1.3.Final版本,无需升级框架或测试依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:06:02