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

