Quarkus中如何为@Provider标注的拦截器创建替代类或Mock/Spy?
在Quarkus中Mock/Spy或替换@Provider拦截器的解决方案
方案一:用Quarkus替代机制完全替换原拦截器
你之前遇到两个拦截器同时执行的问题,是因为原RequestInterceptor仍被Quarkus的CDI容器加载。要实现完全替换,需按以下步骤操作:
给测试用拦截器添加
@Alternative和足够高的优先级,确保它能覆盖原实现:@Provider @Alternative @Priority(Interceptor.Priority.APPLICATION + 1) public class RequestTestInterceptor implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext context) { // 编写测试专属逻辑,比如记录请求上下文参数 } }在测试类中禁用原拦截器,确保只有测试拦截器生效:
@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集成实现:
确保测试依赖包含
quarkus-junit5-mockito:<!-- pom.xml 中添加依赖 --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5-mockito</artifactId> <scope>test</scope> </dependency>在测试类中使用
@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加载:
定义测试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); } }在测试类中应用该Profile:
@QuarkusTest @TestProfile(TestInterceptorProfile.class) public class YourResourceTest { // 测试逻辑 }
内容的提问来源于stack exchange,提问作者Arun Kumar N
相关产品推荐
相关产品推荐

