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
相关产品推荐
相关产品推荐

