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

Quarkus中如何为@Provider标注的拦截器创建替代类或Mock/Spy?

在Quarkus中Mock/Spy或替换@Provider拦截器的解决方案

方案一:用Quarkus替代机制完全替换原拦截器

你之前遇到两个拦截器同时执行的问题,是因为原RequestInterceptor仍被Quarkus的CDI容器加载。要实现完全替换,需按以下步骤操作:

  1. 给测试用拦截器添加@Alternative和足够高的优先级,确保它能覆盖原实现:

    @Provider
    @Alternative
    @Priority(Interceptor.Priority.APPLICATION + 1)
    public class RequestTestInterceptor implements ContainerRequestFilter {
        @Override
        public void filter(ContainerRequestContext context) {
            // 编写测试专属逻辑,比如记录请求上下文参数
        }
    }
    
  2. 在测试类中禁用原拦截器,确保只有测试拦截器生效:

    @QuarkusTest
    @DisableBean(RequestInterceptor.class)
    public class YourResourceTest {
        // 用RestAssured编写测试用例
        @Test
        public void testApiRequest() {
            given()
                .when().get("/your-api-path")
                .then().statusCode(200);
        }
    }
    

方案二:用Mockito Mock/Spy原拦截器(保留部分逻辑+验证)

如果需要保留原拦截器的核心逻辑,同时验证方法调用或修改部分行为,可结合Quarkus的Mockito集成实现:

  1. 确保测试依赖包含quarkus-junit5-mockito:

    <!-- pom.xml 中添加依赖 -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-junit5-mockito</artifactId>
        <scope>test</scope>
    </dependency>
    
  2. 在测试类中使用@SpyBean或@InjectMock处理原拦截器:

    @QuarkusTest
    public class YourResourceTest {
        // Spy原拦截器,保留原有逻辑,同时可验证调用
        @SpyBean
        RequestInterceptor requestInterceptor;
    
        @Test
        public void testInterceptorInvocation() {
            // 调用目标接口
            given()
                .when().get("/your-api-path")
                .then().statusCode(200);
    
            // 验证拦截器的filter方法被调用
            Mockito.verify(requestInterceptor).filter(Mockito.any(ContainerRequestContext.class));
        }
    }
    

    注意:若Mock/Spy不生效,需给原拦截器添加@Dependent作用域,确保CDI能正确代理:

    @Provider
    @Dependent
    public class RequestInterceptor implements ContainerRequestFilter {
        // 原有逻辑
    }
    

方案三:用TestProfile实现多场景拦截器切换

如果需要在不同测试场景使用不同拦截器,可通过自定义TestProfile控制Bean加载:

  1. 定义测试Profile类:

    public class TestInterceptorProfile implements QuarkusTestProfile {
        @Override
        public Set<Class<?>> getEnabledAlternatives() {
            // 启用测试拦截器作为替代实现
            return Collections.singleton(RequestTestInterceptor.class);
        }
    
        @Override
        public Set<Class<?>> getDisabledBeans() {
            // 禁用原拦截器
            return Collections.singleton(RequestInterceptor.class);
        }
    }
    
  2. 在测试类中应用该Profile:

    @QuarkusTest
    @TestProfile(TestInterceptorProfile.class)
    public class YourResourceTest {
        // 测试逻辑
    }
    

内容的提问来源于stack exchange,提问作者Arun Kumar N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:54:54