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

quarkus-junit5-mockito已废弃,Quarkus应用单元测试如何Mock REST客户端?

在Quarkus 3.4中Mock REST客户端的替代方案

由于quarkus-junit5-mockito从Quarkus 3.2起被废弃,你可以通过以下两种主流方式实现REST客户端的Mock,完成单元测试:

方法1:结合Quarkus Mockito扩展动态Mock

Quarkus 3.x将Mockito支持拆分到独立的quarkus-mockito依赖中,配合核心测试扩展即可实现动态Mock:

步骤1:引入必要依赖

替换原废弃依赖,添加以下内容到pom.xml:

<!-- 基础REST Client依赖 -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-rest-client</artifactId>
</dependency>
<!-- 若用JSON序列化,添加Jackson支持 -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-rest-client-jackson</artifactId>
</dependency>
<!-- Quarkus核心测试扩展 -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-junit5</artifactId>
    <scope>test</scope>
</dependency>
<!-- Mockito整合扩展 -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-mockito</artifactId>
    <scope>test</scope>
</dependency>

步骤2:编写测试代码

假设你的REST客户端接口为MyRemoteService:

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

测试类中通过@InjectMock注入Mock实例,配合@RestClientMock启用REST客户端Mock机制:

import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;
import io.quarkus.test.junit.rest.client.RestClientMock;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.when;

@QuarkusTest
@RestClientMock
public class MyBusinessServiceTest {

    @InjectMock
    MyRemoteService myRemoteService;

    @Test
    public void testRemoteCallMocked() {
        // 动态Mock接口方法的返回值
        when(myRemoteService.fetchData()).thenReturn("Mocked Response Data");

        // 调用依赖该REST客户端的业务方法,验证逻辑正确性
        // 示例:String result = myBusinessService.processRemoteData();
        // 断言结果符合预期
    }
}

这种方式支持灵活设置Mock返回值、验证方法调用次数等复杂场景,完全替代原废弃依赖的功能。

方法2:手动注册Mock Bean实现静态Mock

如果不需要动态Mock的灵活性,可通过自定义Mock类+测试配置文件的方式替换原REST客户端实现:

步骤1:编写Mock实现类

实现目标REST客户端接口,提供固定Mock逻辑:

@ApplicationScoped
@RestClient
public class MockMyRemoteService implements MyRemoteService {
    @Override
    public String fetchData() {
        return "Static Mocked Data";
    }
}

步骤2:创建测试配置文件

定义TestProfile,指定用Mock类替换原REST客户端:

import io.quarkus.test.junit.QuarkusTestProfile;
import java.util.Map;

public class RemoteServiceMockProfile implements QuarkusTestProfile {
    @Override
    public Map<String, String> getConfigOverrides() {
        // 配置键格式:quarkus.rest-client.【接口类名】.class
        return Map.of("quarkus.rest-client.MyRemoteService.class", "com.yourpackage.MockMyRemoteService");
    }
}

步骤3:编写测试代码

在测试类中指定使用该配置文件,直接注入Mock后的实例:

import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.TestProfile;
import jakarta.inject.Inject;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

@QuarkusTest
@TestProfile(RemoteServiceMockProfile.class)
public class MyBusinessServiceStaticMockTest {

    @Inject
    MyRemoteService myRemoteService;

    @Test
    public void testStaticMock() {
        String result = myRemoteService.fetchData();
        assertEquals("Static Mocked Data", result);
    }
}

这种方式无需依赖Mockito,适合返回值固定的简单测试场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:35