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

Spring Boot+Java环境下使用MockServer模拟外部服务响应方案咨询

使用MockServer在Spring Boot中模拟外部API响应

1. 引入依赖

在Maven项目的pom.xml中添加MockServer相关依赖(Gradle项目可对应转换):

<dependencies>
    <!-- 测试环境自动集成依赖 -->
    <dependency>
        <groupId>org.mock-server</groupId>
        <artifactId>mockserver-spring-test</artifactId>
        <version>5.15.0</version>
        <scope>test</scope>
    </dependency>
    <!-- Java客户端,用于配置Mock规则 -->
    <dependency>
        <groupId>org.mock-server</groupId>
        <artifactId>mockserver-client-java</artifactId>
        <version>5.15.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

注:请使用与你的Spring Boot版本兼容的最新MockServer版本。

2. 测试环境快速集成

在测试类上添加@MockServerTest注解,MockServer会自动启动并注入MockServerClient实例,无需额外配置:

import org.mockserver.spring.test.MockServerTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.mockserver.client.MockServerClient;

@MockServerTest
public class ExternalServiceMockTest {

    @Autowired
    private MockServerClient mockServerClient;

    // 测试代码...
}

3. 定义Mock规则

通过MockServerClient配置请求匹配规则和对应的响应,模拟外部API的行为。例如,模拟一个GET接口返回用户信息:

import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.HttpResponse.response;
import static org.mockserver.model.JsonBody.json;

@Test
void testMockExternalUserApi() {
    // 匹配外部API的请求:GET /user/123
    HttpRequest expectedRequest = request()
            .withMethod("GET")
            .withPath("/user/123");

    // 定义Mock响应:200状态码+用户JSON
    HttpResponse mockResponse = response()
            .withStatusCode(200)
            .withBody(json("{\"id\":123,\"name\":\"John Doe\",\"email\":\"john@example.com\"}"));

    // 绑定请求与响应
    mockServerClient.when(expectedRequest).respond(mockResponse);

    // 调用你的业务代码(此时业务代码应指向MockServer的地址)
    String apiResponse = restTemplate.getForObject(mockServerClient.getRemoteAddress() + "/user/123", String.class);

    // 验证结果符合预期
    assert apiResponse.contains("John Doe");
}

4. 开发环境Mock配置

如果需要在本地开发环境而非仅测试环境中模拟外部API,可按以下步骤操作:

  1. 启动独立MockServer实例:
    使用Docker快速启动:
    docker run -d -p 1080:1080 mockserver/mockserver
    
    或下载jar包手动启动:
    java -jar mockserver-netty-5.15.0.jar -serverPort 1080
    
  2. 配置业务代码指向MockServer:
    在application-dev.properties中修改外部API的基础地址:
    external.api.base-url=http://localhost:1080
    
  3. 配置Mock规则:
    可通过MockServer的Web控制台(访问本地1080端口的dashboard路径)可视化配置规则,或在Spring Boot启动类中通过MockServerClient编程式配置:
    @Bean
    public CommandLineRunner mockExternalApi(MockServerClient mockServerClient) {
        return args -> {
            // 配置POST接口Mock规则
            mockServerClient.when(request()
                    .withMethod("POST")
                    .withPath("/user")
                    .withBody(json("{\"name\":\"Jane Doe\"}")))
                    .respond(response()
                            .withStatusCode(201)
                            .withBody(json("{\"id\":456,\"name\":\"Jane Doe\"}")));
        };
    }
    

5. 常见场景模拟

  • 模拟错误响应:
    mockServerClient.when(request().withPath("/user/999"))
            .respond(response().withStatusCode(404).withBody("用户不存在"));
    
  • 匹配请求参数:
    HttpRequest requestWithParams = request()
            .withMethod("GET")
            .withPath("/users")
            .withQueryStringParameter("role", "admin");
    
    mockServerClient.when(requestWithParams)
            .respond(response().withBody(json("[{\"id\":1,\"role\":\"admin\"}]")));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:53:14