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

