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

Quarkus测试中如何仅注入指定服务而不启动完整应用?

在Quarkus中仅注入指定服务进行测试的可行方案

核心解决方案

要实现仅加载MainService和所有Secondary接口实现类、触发它们的@PostConstruct及@Startup逻辑,可通过@QuarkusComponentTest配合特定注解完成,无需启动完整应用上下文:

  1. 精准指定要加载的Bean
    使用@IncludeBeans注解,直接指定MainService和Secondary接口——Quarkus会自动扫描并加载所有实现Secondary接口的类,无需逐个罗列,适配实现类数量变动的场景。

  2. 启用@Startup Bean的初始化逻辑
    添加@EnableStartup注解,确保标注了@Startup的MainService会被初始化,同时触发所有Bean的@PostConstruct方法。

完整测试示例代码

import io.quarkus.test.junit.QuarkusComponentTest;
import io.quarkus.test.junit.IncludeBeans;
import io.quarkus.test.junit.EnableStartup;
import jakarta.inject.Inject;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;

@QuarkusComponentTest
@IncludeBeans({MainService.class, Secondary.class})
@EnableStartup
public class MainServiceRegistrationTest {

    @Inject
    MainService mainService;

    @Inject
    List<Secondary> secondaryServices;

    @Test
    void verifySecondaryServicesRegistered() {
        // 验证所有Secondary实现都已注册到MainService的映射中
        assertEquals(secondaryServices.size(), mainService.getRegisteredSecondaryCount());
    }
}

关键注意事项

  • 如果Secondary实现类存在其他依赖,需确保这些依赖要么通过@IncludeBeans一并加载,要么用@MockBean模拟依赖,避免测试因依赖缺失失败。
  • 若Bean分布在不同包下,可通过@IncludeBeans(scanPackageClasses = {Secondary.class})指定扫描基准类所在的包,确保所有相关Bean被正确识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:12:09