如何在单元测试中不使用@QuarkusTest即可启动ArC CDI容器?
轻量使用ArC容器进行单元测试的方案
Quarkus 2.8及以上版本官方提供了@ArcTest注解,完全匹配你的需求:仅启动ArC CDI容器,不会初始化完整的Quarkus运行时环境,启动速度和weld-junit相当,且直接使用生产环境的ArC实现,不存在CDI规范兼容差异导致测试和生产行为不一致的问题。
依赖引入
使用JUnit5时仅需引入quarkus-junit5测试依赖即可,Maven配置示例如下:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5</artifactId> <scope>test</scope> </dependency>
测试用例编写
直接在测试类上添加@ArcTest注解,需要用到的Bean、拦截器、装饰器直接通过@Inject注入即可,和常规CDI测试用法完全一致:
import io.quarkus.test.junit.ArcTest; import javax.inject.Inject; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @ArcTest public class CustomInterceptorTest { // 注入绑定了对应拦截器/装饰器的业务Bean @Inject OrderService orderService; @Test public void testInterceptorLogic() { Order testOrder = new Order(); orderService.create(testOrder); // 验证拦截器的日志、权限校验等逻辑是否正常生效 assertNotNull(testOrder.getCreateTime()); } }
常用适配配置
- 如果需要测试请求域相关的Bean,直接在测试类或方法上添加
@ActivateRequestContext注解即可启用请求上下文 - 可以通过
@IgnoredBean注解排除不需要加载的Bean,减少容器启动开销 - 支持通过测试配置文件指定
arc.test.selected-alternatives等参数,自定义CDI替代类、装饰器优先级等规则
如果使用的是2.8以下的低版本Quarkus,也可以使用@QuarkusUnitTest配合配置关闭所有非必要的Quarkus扩展,仅保留ArC核心组件,也能实现类似的轻量测试效果,更推荐升级到高版本直接使用@ArcTest,配置更简单,启动速度更快。
内容的提问来源于stack exchange,提问作者Johannes Hahn
相关产品推荐
相关产品推荐

