关于后端:浅谈-Mock-Server

39次阅读

共计 3151 个字符,预计需要花费 8 分钟才能阅读完成。

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));
    }
}

正文完
 0