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

Quarkus 3.8测试无quarkus-junit5-mockito扩展,如何Mock外部API?

在Quarkus 3.8中Mock外部API调用的解决方案

问题根源

Quarkus 3.x版本对Mockito相关扩展做了命名调整,原quarkus-junit5-mockito扩展已被统一更名为quarkus-mockito,这就是你找不到旧扩展的原因。

解决步骤

1. 添加正确的Mockito依赖

根据你的构建工具,添加对应的quarkus-mockito测试依赖:

Maven

在pom.xml的<dependencies>中加入:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-mockito</artifactId>
    <scope>test</scope>
</dependency>

Gradle

在build.gradle的dependencies中加入:

testImplementation 'io.quarkus:quarkus-mockito'

2. 结合QuarkusMock与Mockito实现Mock

以RestClient Reactive为例,按照官方指南思路结合Mockito完成Mock:

假设你有一个RestClient接口:

@RegisterRestClient(baseUri = "https://external-api.com")
public interface ExternalApiClient {
    @GET
    @Path("/data")
    String fetchData();
}

测试类中可这样Mock:

import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.QuarkusMock;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.when;
import static org.junit.jupiter.api.Assertions.assertEquals;

@QuarkusTest
public class ExternalApiTest {

    @Inject
    ExternalApiClient externalApiClient;

    @BeforeEach
    void setupMock() {
        // 创建Mock实例
        ExternalApiClient mockClient = org.mockito.Mockito.mock(ExternalApiClient.class);
        // 定义Mock行为
        when(mockClient.fetchData()).thenReturn("Mocked response from external API");
        // 将Mock安装到Quarkus容器
        QuarkusMock.installMockForType(mockClient, ExternalApiClient.class);
    }

    @Test
    void testExternalApiCall() {
        String response = externalApiClient.fetchData();
        assertEquals("Mocked response from external API", response);
    }
}

注意事项

  • 测试类必须添加@QuarkusTest注解,确保Quarkus测试容器正确加载并应用Mock。
  • 若使用RestClient Reactive,quarkus-mockito已包含所需的Mockito集成能力,无需额外扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:47:13