Quarkus 1.13.1中Mockito无法注入Rest Client的问题
Quarkus 1.13.1.Final中@InjectMock + @RestClient注入时报Mockito无法mock final类错误的解决方法
问题分析
你遇到的错误是因为Quarkus 1.13.1.Final版本中,Rest Client生成的代理类是final类,而Mockito默认不支持mock final类,当你同时使用@InjectMock和@RestClient注解时,Mockito尝试mock这个final代理类,就会抛出Cannot mock/spy class com.sun.proxy.$ProxyXX的异常。
解决方案
下面提供两种可行的解决方法:
方法一:启用Mockito Inline Mock Maker
Mockito的inline扩展支持mock final类,只需添加一个配置文件即可:
- 在测试资源目录下创建路径及文件:
src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker - 文件中写入一行内容:
mock-maker-inline
- 重新运行测试,
@InjectMock即可正常注入Rest Client的mock实例。
方法二:使用Quarkus的@Mock注解替代@InjectMock
通过创建Rest Client接口的mock实现类,并用Quarkus的@Mock注解标记,替代原始的Rest Client代理:
- 创建一个实现
CustomClient接口的mock类:
import io.quarkus.test.Mock; import org.eclipse.microprofile.rest.client.inject.RestClient; import static org.mockito.Mockito.mock; @Mock @RestClient public class CustomClientMock implements CustomClient { @Override public Object findById(String id) { // 这里可以直接编写mock逻辑,或者用Mockito动态mock返回值 return mock(Object.class); } }
- 在测试类中直接注入这个mock实例:
@Inject CustomClient customClient;
- 运行测试时,Quarkus会自动用
CustomClientMock替代原始的Rest Client代理,你可以通过Mockito API设置mock的行为(比如when(customClient.findById("1")).thenReturn(...))。
注意事项
- 确保
@InjectMock导入的是io.quarkus.test.junit.mockito.InjectMock,而非Mockito原生的org.mockito.Mock。 - 方法一中的inline mock maker在Mockito 2.20+版本支持,Quarkus 1.13.1.Final集成的Mockito版本满足要求。
内容的提问来源于stack exchange,提问作者devs4wl
相关产品推荐
相关产品推荐

