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

