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

如何在测试中Mock拦截器方法?附Quarkus代码示例

如何在测试中Mock拦截器方法?

以下是你提供的业务类和拦截器代码:

业务类示例

@ApplicationScoped
public class MyServiceImpl implements MyService {

    @Override
    @MyAnnotation
    public Uni<List<SomeDto>> getAll() {
        return // 业务逻辑实现
    }
}

拦截器示例

@Priority(100)
@MyAnnotation
@Interceptor
public class MyInterceptor {

    @AroundInvoke
    public Object someMethod(InvocationContext ic) throws Exception {
       // 拦截逻辑
        return ic.proceed();
    }
}

针对Quarkus环境,有两种常用方式来Mock拦截器的someMethod方法:


方法一:创建Mock拦截器类替换原实现

直接编写一个带@Mock注解的拦截器,测试时Quarkus会自动用它替换原拦截器:

@Mock
@Priority(1) // 优先级高于原拦截器,确保被优先加载
@MyAnnotation
@Interceptor
public class MockMyInterceptor {

    @AroundInvoke
    public Object someMethod(InvocationContext ic) throws Exception {
        // 自定义Mock逻辑,比如直接放行或添加测试逻辑
        System.out.println("Mock拦截器已触发");
        return ic.proceed();
    }
}

测试类中正常注入业务类即可:

@QuarkusTest
class SomeServiceTest {

    @Inject
    MyService myService;

    @Test
    void getAllNotBlacklisted() {
        Uni<List<SomeDto>> result = myService.getAll();
        // 验证业务结果或Mock拦截器的执行情况
    }
}

方法二:用Mockito直接Mock拦截器实例

借助Quarkus的@InjectMock注解,配合Mockito来动态Mock拦截器方法:

@QuarkusTest
class SomeServiceTest {

    @Inject
    MyService myService;

    @InjectMock
    MyInterceptor myInterceptor;

    @Test
    void getAllNotBlacklisted() throws Exception {
        // 自定义拦截器方法的Mock行为
        when(myInterceptor.someMethod(any(InvocationContext.class)))
                .thenAnswer(invocation -> {
                    // 这里可以添加自定义逻辑,比如修改参数或直接放行
                    InvocationContext ctx = invocation.getArgument(0);
                    System.out.println("Mock拦截逻辑执行");
                    return ctx.proceed();
                });

        Uni<List<SomeDto>> result = myService.getAll();
        // 执行断言验证
    }
}

关键注意点

  • 优先级设置:如果用替换类的方式,需保证Mock拦截器的@Priority值比原拦截器小,确保被优先选中
  • @InjectMock需要依赖Quarkus Mockito扩展,确保项目中已引入quarkus-mockito依赖
  • 若拦截器有其他依赖,也可通过@InjectMock一并Mock

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:20:43