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

Java Spring Boot项目中Retrofit第三方API调用Mock测试咨询

针对Retrofit第三方API Mock测试的解决方案

一、Mock实现方案(适配Retrofit)

针对Retrofit的调用逻辑,有两种高效的Mock方式,按需选择:

1. 用Mockito直接Mock Retrofit接口

Retrofit的核心是你定义的API接口,直接Mock这个接口是最轻量化的方案,无需依赖外部服务:

// 假设你的Retrofit API接口为ThirdPartyApi
@Mock
private ThirdPartyApi thirdPartyApi;

@InjectMocks
private YourBusinessService serviceUnderTest; // 依赖ThirdPartyApi的业务服务类

@BeforeEach
void setUp() {
    MockitoAnnotations.openMocks(this);
}

@Test
void testApiCallSuccess() {
    // Mock接口方法的成功响应
    Mockito.when(thirdPartyApi.fetchTargetData(Mockito.anyString()))
           .thenReturn(Response.success(new ApiResponseDto("mock返回数据")));
    
    // 执行业务逻辑
    BusinessResult result = serviceUnderTest.handleBusiness("测试参数");
    
    // 断言结果符合预期
    Assertions.assertEquals("mock返回数据", result.getContent());
    // 验证接口调用次数
    Mockito.verify(thirdPartyApi, Mockito.times(1)).fetchTargetData("测试参数");
}

@Test
void testApiCallFailure() {
    // Mock接口的错误响应
    RequestBody errorBody = RequestBody.create(MediaType.parse("application/json"), "{\"msg\":\"资源不存在\"}");
    Mockito.when(thirdPartyApi.fetchTargetData(Mockito.anyString()))
           .thenReturn(Response.error(404, errorBody));
    
    // 验证业务逻辑对错误的处理
    Assertions.assertThrows(BusinessException.class, () -> serviceUnderTest.handleBusiness("无效参数"));
}

2. 修复WireMock的使用问题(若需保留)

如果之前用WireMock未达预期,核心是要让Retrofit的请求地址指向WireMock服务:

@SpringBootTest(properties = {"third-party.api.base-url=http://localhost:8080"})
public class ThirdPartyApiIntegrationTest {

    @Autowired
    private YourBusinessService serviceUnderTest;

    @Rule
    public WireMockRule wireMockRule = new WireMockRule(8080);

    @Test
    void testWireMockMockedResponse() {
        // 配置WireMock的响应规则
        stubFor(get(urlEqualTo("/api/v1/data?param=测试参数"))
                .willReturn(aResponse()
                        .withStatus(200)
                        .withHeader("Content-Type", "application/json")
                        .withBody("{\"content\":\"WireMock模拟数据\"}")));
        
        BusinessResult result = serviceUnderTest.handleBusiness("测试参数");
        
        Assertions.assertEquals("WireMock模拟数据", result.getContent());
        // 验证请求是否符合预期
        verify(getRequestedFor(urlEqualTo("/api/v1/data?param=测试参数")));
    }
}

注意:必须确保项目中Retrofit客户端的BaseUrl是可配置的(通过application.yml/application.properties),测试时动态替换为WireMock的服务地址。

二、单元测试 vs 集成测试:选择逻辑

  • 单元测试:针对单个业务类,Mock Retrofit接口实现隔离测试。优点是执行速度快、隔离性强,能覆盖业务逻辑的所有分支(成功、失败、异常场景),这是日常开发的最佳实践,可快速反馈代码问题。
  • 集成测试:用WireMock模拟真实第三方API,测试完整调用链路(业务服务→Retrofit客户端→Mock服务)。优点是贴近真实场景,适合验证HTTP请求的构造是否正确(比如参数、请求头、请求体格式),但执行效率低,适合作为补充测试覆盖核心流程。

三、最佳实践总结

  1. 优先编写单元测试:用Mockito Mock Retrofit接口,保障核心业务逻辑的正确性,这是测试的主力。
  2. 补充集成测试:用WireMock验证HTTP请求的合法性,避免请求构造时的低级错误。
  3. 保证Retrofit接口的设计符合单一职责,降低Mock和测试的复杂度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:55:31