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

@QuarkusTest测试中如何替换javax.enterprise.inject.Instance中的指定实现类

测试场景下Instance单实现类替换稳定方案

操作步骤

  • 在测试目录下的TypeBMockValidator实现类上添加@Alternative、@Priority(1)注解,保留@ApplicationScoped,无需添加@Mock注解,示例代码如下:
import javax.annotation.Priority;
import javax.enterprise.inject.Alternative;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
@Alternative
@Priority(1)
public class TypeBMockValidator implements Validator {
    // 实现你的Mock逻辑即可
}
  • 无需修改主源码的任何配置,直接运行标注了@QuarkusTest的测试用例即可。

此时注入的Instance<Validator>会自动包含正常的TypeAValidator和Mock的TypeBMockValidator,原有的TypeBValidator不会被加载到容器中,完全符合测试需求。

原方案失效原因说明

  • 旧方案使用的@Mock是Quarkus测试提供的注解,其底层逻辑是全量替换对应接口的所有实现Bean,只会保留标注了@Mock的实现,因此会导致其他正常校验器无法注入。
  • 无注解直接新增同接口实现的方案会触发CDI的歧义校验规则,容器识别到两个同类型的TypeBValidator实现,无法判定使用哪一个,因此抛出AmbiguousResolutionException异常。

方案优势

  • 所有改动都集中在测试目录,完全不影响生产环境运行逻辑。
  • 基于CDI标准的@Alternative和优先级规则实现,兼容所有Quarkus版本,行为稳定可预期。
  • 支持同时替换同接口的多个实现,只需要给每个Mock实现都添加对应注解即可,未被替换的实现会正常加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:45:03