What?什么是 Mock Server

Mock 是模仿的意思。在测试中,通常表述为:对测试过程中不容易结构或者不容易获取的物件,用一个虚构的物件来进行模仿的一个过程。可能提供 Mock 性能的服务就叫作 Mock Server。 Mock Server 通过模仿实在的服务,提供对来自客户端申请的实在响应。

Why?为什么要用 Mock Server

  1. 在开发初期先模仿内部接口,防止间接应用理论内部接口进行开发调试,进步开发效率
  2. 全面精确的模仿内部接口的返回,进步本身代码的可靠性,晋升验证的全面性

How?怎么用 Mock Server

次要包含两种应用形式,一种是通过一个现成的 Mock Server 服务,这种的益处是对代码无侵入,只须要将调用的 URL 批改为 Mock Server 提供的 URL 即可。另一种是在代码外面显式的编写相干的规定,这样的益处是不再须要独自启用服务,在代码外面就能够实现 Mock,次要在单测的时候应用。

应用形式一:通过现成的服务打桩

能够应用相似 apifox 工具本地/线上打桩,apifox 不仅有基于 Swgger 的 API 治理的能力,同时也具备 API Mock 的性能。具体应用办法能够拜访: https://www.apifox.cn/

应用形式二:通过代码打桩

MockServer 官网文档 http://www.mock-server.com
Maven 引入

<dependency>    <groupId>org.mock-server</groupId>    <artifactId>mockserver-netty</artifactId>    <version>5.4.1</version></dependency><dependency>    <groupId>org.mock-server</groupId>    <artifactId>mockserver-client-java</artifactId>    <version>5.4.1</version></dependency>

示例一

ClientAndServer 用法

package com.yzy.mock;import org.mockserver.integration.ClientAndServer;import org.mockserver.model.Cookie;import static org.mockserver.model.HttpRequest.request;import static org.mockserver.model.HttpResponse.response;import static org.mockserver.model.Parameter.param;public class MockServer {    public static void main(String[] args) {        ClientAndServer server = new ClientAndServer(1080);        server.when(                request()                        .withMethod("GET")                        .withPath("/test")                        .withQueryStringParameters(                                param("p", "1")                        )        ).respond(                response()                        .withCookie(new Cookie("cKey", "cValue"))                        .withBody("test1")        );        server.when(                request()                        .withMethod("GET")                        .withPath("/test")                        .withQueryStringParameters(                                param("p", "2")                        )        ).respond(                response()                        .withBody("test2")        );    }}

启动 main 办法,关上浏览器,输出 http://localhost:1080/test?p=1,页面返回test1,并且胜利写入cookie。留神写入的cookie 是Session 级别的,会话敞开将隐没。输出http://localhost:1080/test?p=2,页面返回 test2,阐明 MockServer 同时监听的两个匹配都无效。

示例二

MockServerClient 用法

package mock;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.junit.Rule;import org.junit.Test;import org.mockserver.client.MockServerClient;import org.mockserver.junit.MockServerRule;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import static org.hamcrest.core.IsEqual.equalTo;import static org.junit.Assert.assertThat;import static org.mockserver.model.HttpRequest.request;import static org.mockserver.model.HttpResponse.response;public class MockServerTest {    @Rule    public MockServerRule server = new MockServerRule(this, 1080);    @Test    public void test() throws IOException {        MockServerClient mockClient = new MockServerClient("localhost", 1080);        String expected = "hello world";        mockClient.when(                request()                        .withPath("/hello")                        .withMethod("GET")        ).respond(                response()                        .withStatusCode(200)                        .withBody(expected)        );        CloseableHttpClient client = HttpClients.createDefault();        HttpGet httpGet = new HttpGet("http://localhost:1080/hello");        CloseableHttpResponse response = client.execute(httpGet);        //验证        InputStream content = response.getEntity().getContent();        InputStreamReader inputStreamReader = new InputStreamReader(content);        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);        String responseText = bufferedReader.readLine();        assertThat(responseText, equalTo(expected));    }}