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

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代理:

  1. 创建一个实现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);
    }
}
  1. 在测试类中直接注入这个mock实例:
@Inject
CustomClient customClient;
  1. 运行测试时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:15:38