如何在测试中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
相关产品推荐
相关产品推荐

