JAVA

Java后端mockserver使用方法

什么是 Mock Server?


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

MockServer其实就是一个用来模拟http(https)请求响应结果数据的服务器。通过这个MockServer服务,我们可以极大地方便接口的调试。

为什么要用 Mock Server?


如今的业务系统模块越来越多,功能也越来越复杂。及时的与前端调试也迎来了一些小的挑战。

假设有一个场景:
新项目刚开始启动时,这时候后台部分的接口都没有开发完成,这时候如果前端需要调试页面,该怎么调试呢?

傻傻的等着后台开发完成再进行调试?不可能的,这样你会影响项目正常上线。那么模拟数据就显得非常重要了,如何快速有效的模拟真实场景的数据?

有两种方案:

  • 通常情况下,后台会把请求接口Api的结果先定义好,写死在action层,然后返回给前端,但是这种方案现在已经不怎么用了,效率太低
  • 现在比较流行的方案,一般会搭建一些server来进行mock,这样可以使得被开发功能的调试和测试功能能够正常进行下去。而MockServer就可以有效的解决这个问题,这也是MockServer的出现的原因

使用mock之前:

使用了Mock Server之后,前端可以不再依赖与后台的业务接口,在后台接口未开发完成时,可以模拟一些业务数据,来进行前台页面的调试,极大的节省了调试的成本

安装MockServer


要使用MockServer,首先需要下载并安装MockServer的jar包。你可以在MockServer的官方网站上找到最新版本的jar包,下载并将其添加到你的项目中。

<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>

在开始使用MockServer之前,我们需要进行一些配置。以下是配置MockServer的几个步骤:

  1. 创建MockServer实例

首先,我们需要创建一个MockServer实例。在Java中,我们可以使用以下代码创建一个MockServer实例:

import org.mockserver.integration.ClientAndServer;

ClientAndServer mockServer = ClientAndServer.startClientAndServer(8080);

上面的代码创建了一个在本地8080端口运行的MockServer实例。

2.设置MockServer的响应

接下来,我们可以设置MockServer的响应。例如,我们可以为一个特定的HTTP请求设置一个自定义的响应。

import org.mockserver.model.HttpRequest;
import org.mockserver.model.HttpResponse;
import static org.mockserver.integration.ClientAndServer.*;

mockServer.when(request().withMethod("GET").withPath("/hello"))
          .respond(response().withStatusCode(200).withBody("Hello, World!"));

上述代码将为GET /hello请求设置一个响应,状态码为200,响应体为”Hello, World!”。

  1. 启动MockServer

最后,我们需要启动MockServer,以便它可以开始监听并响应请求。

mockServer.start();

使用MockServer进行测试


一旦我们配置好MockServer,我们就可以使用它进行测试了。以下是使用MockServer进行测试的几个步骤:

  1. 发送HTTP请求

首先,我们需要发送一个HTTP请求到MockServer,并获取响应结果。

import org.apache.http.client.fluent.Request;

String response = Request.Get("http://localhost:8080/hello").execute().returnContent().asString();

2.验证响应结果

接下来,我们可以验证MockServer返回的响应结果是否符合预期。

import static org.junit.Assert.assertEquals;

assertEquals("Hello, World!", response);

上述代码验证响应结果是否为”Hello, World!”。

  1. 停止MockServer

最后,我们需要停止MockServer,以便释放资源。

mockServer.stop();

示例

下面是一个完整的使用MockServer进行测试的示例代码:

import org.mockserver.integration.ClientAndServer;
import org.mockserver.model.HttpRequest;
import org.mockserver.model.HttpResponse;
import org.apache.http.client.fluent.Request;
import static org.mockserver.integration.ClientAndServer.*;
import static org.junit.Assert.assertEquals;

public class MockServerExample {

    public static void main(String[] args) {
        // 创建MockServer实例
        ClientAndServer mockServer = ClientAndServer.startClientAndServer(8080);

        // 设置MockServer的响应
        mockServer.when(request().withMethod("GET").withPath("/hello"))
                  .respond(response().withStatusCode(200).withBody("Hello, World!"));

        // 发送HTTP请求
        String response = Request.Get("http://localhost:8080/hello").execute().returnContent().asString();

        // 验证响应结果
        assertEquals("Hello, World!", response);

        // 停止MockServer
        mockServer.stop();
    }
}

另外两个例子


示例1 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 同时监听的两个匹配都有效。

示例2 ClientAndServer 用法

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