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

使用Rest Assured创建JSON文件模拟内部调用API的返回结果

用Rest Assured结合JSON文件模拟微服务返回的实现方法

下面是几种实用的实现方案,根据你的项目场景选择即可:

1. 用Rest Assured内置StubServer实现

Rest Assured自带StubServer,可直接模拟外部服务接口,配合本地JSON文件返回预设响应:

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import java.nio.file.Files;
import java.nio.file.Paths;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.equalTo;

public class MockExternalServiceTest {

    @org.junit.Test
    public void testWithStubServer() throws Exception {
        // 启动本地Stub服务器,监听8081端口
        io.restassured.mock.mvc.server.StubServer stubServer = new io.restassured.mock.mvc.server.StubServer(8081);
        stubServer.start();

        // 从本地JSON文件读取模拟响应内容
        String mockJsonResponse = Files.readString(Paths.get("src/test/resources/mock-external-response.json"));

        // 配置Stub规则:匹配指定请求路径时返回JSON内容
        stubServer.when(io.restassured.mock.mvc.request.RequestSpecificationBuilders.request().withPath("/external-service/api/v1/data"))
                  .thenReturn(io.restassured.mock.mvc.response.ResponseBuilders.response()
                                .withStatusCode(200)
                                .withContentType(ContentType.JSON)
                                .withBody(mockJsonResponse));

        // 将Rest Assured的请求目标指向Stub服务器
        RestAssured.baseURI = "http://localhost:8081";

        // 执行测试并验证响应
        given()
            .when()
            .get("/external-service/api/v1/data")
            .then()
            .statusCode(200)
            .body("code", equalTo(0))
            .body("data.name", equalTo("Mocked User"));

        // 测试结束后停止Stub服务器
        stubServer.stop();
    }
}

2. 用WireMock加载JSON配置文件(更灵活)

WireMock是专门的HTTP接口模拟工具,支持通过JSON配置文件定义接口规则,适合复杂场景:

步骤1:添加WireMock依赖(Maven为例)

<dependency>
    <groupId>com.github.tomakehurst</groupId>
    <artifactId>wiremock-jre8</artifactId>
    <version>2.35.0</version>
    <scope>test</scope>
</dependency>

步骤2:创建Stub配置文件

在src/test/resources/mappings目录下新建external-service-mapping.json:

{
  "request": {
    "method": "GET",
    "url": "/external-service/api/v1/data"
  },
  "response": {
    "status": 200,
    "headers": {
      "Content-Type": "application/json"
    },
    "bodyFileName": "mock-response.json"
  }
}

然后在src/test/resources/__files目录下放入mock-response.json(即你要模拟的返回内容)。

步骤3:编写测试代码

import com.github.tomakehurst.wiremock.WireMockServer;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.equalTo;

public class WireMockExternalServiceTest {

    @org.junit.Test
    public void testWithWireMock() {
        // 启动WireMock服务器
        WireMockServer wireMockServer = new WireMockServer(options().port(8081));
        wireMockServer.start();

        // 指向WireMock地址
        RestAssured.baseURI = "http://localhost:8081";

        // 执行测试并验证
        given()
            .when()
            .get("/external-service/api/v1/data")
            .then()
            .statusCode(200)
            .body("data.id", equalTo(1001));

        // 停止服务器
        wireMockServer.stop();
    }
}

3. Spring Boot项目结合@MockBean+JSON文件

如果你的服务通过FeignClient/RestTemplate调用外部微服务,可直接Mock对应的客户端接口,从JSON文件加载响应对象:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import static org.mockito.Mockito.when;
import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class SpringBootMockTest {

    @MockBean
    private ExternalServiceFeignClient externalServiceFeignClient;

    @Autowired
    private YourBusinessService yourBusinessService;

    @Test
    void testBusinessLogic() throws Exception {
        // 读取JSON文件并反序列化为响应对象
        ObjectMapper objectMapper = new ObjectMapper();
        ExternalServiceResponse mockResponse = objectMapper.readValue(
            getClass().getResourceAsStream("/mock-external-response.json"),
            ExternalServiceResponse.class
        );

        // Mock Feign客户端的返回值
        when(externalServiceFeignClient.getData()).thenReturn(mockResponse);

        // 调用业务方法并验证结果
        String result = yourBusinessService.processData();
        assertEquals("Expected Result", result);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:55:21