背景介绍

First Blood!我们在开发中有没有遇到这俩种情况?
1.前后端协同开发时,前端同学需要后端数据来做前端渲染的事情,但是后端数据库神马的都没有,或者后端调用第三方的接口目前没有写好,我们怎么办?
2.生产环境调用其他三方接口ok,但是测试环境第三方没有开白名单,导致没有数据的问题,测试同学说没有数据就是有BUG!!!
Mock可以构造你想要的数据格式!

mock服务本地搭建

1.官网地址:http://wiremock.org/ Jar下载:http://repo1.maven.org/maven2/com/github/tomakehurst/wiremock/1.57/wiremock-1.57-standalone.jar(前提是需要安装jdk)

2.mock服务启停:java -jar wiremock-1.57-standalone.jar 可以通过-port 指定固定启动端口号。如果不指定的话默认为8080。启动成功如下图:

java mock实例 java的mock_spring


3.mock服务目录:当执行了上面Mock服务启动时,会在该jar 同等目录下生成_files和mappings。

mappings目录存放完整的请求文件,_files可以存放大的json格式文件。文件格式必须要是.json结尾。每一次改动json文件都需要重启WireMock服务!!!

java mock实例 java的mock_python_02

mock支持的请求格式

mock支持GET,POST,PUT,DELETE等多种格式。也支持url匹配,body匹配。
GET请求:
例如:我们想构造一个请求方式为get,url为/api/mytest,我们期望的返回体为hello world,那我们可以先在mappings目录下面创建一个hello.json文件,填充下面的请求格式和返回,就可以得到我们想要的结果返回。

{
    "request": {
        "method": "GET",
        "url": "/api/mytest"
    },
    "response": {
        "status": 200,
        "body": "Hello World"
    }
}

POST请求:

{
    "request": {
        "method": "POST",
        "url": "/api/products",
          "bodyPatterns": [
                 {"equalToJson" : "{ \"name\": \"new product\", \"creator\": \"tester\", \"createTime\": \"2015-09-07\" }", "jsonCompareMode": "LENIENT"}
         ]
    },
    "response": {
        "status": 201,
        "body": "Add successfully.",
         "headers":{
                   "x-token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
         }
    }
}

PUT请求(body体匹配):

{
    "request": {
        "method": "PUT",
        "url": "/api/products/1",
          "bodyPatterns": [
            {"equalToJson" : "{ \"id\": 1, \"name\": \"new product\", \"creator\": \"tester\", \"createTime\": \"2015-09-07\" }", "jsonCompareMode": "LENIENT"}
         ]
    },
    "response": {
        "status": 200,
        "body": "Update successfully.",
         "headers":{
                  "x-token":" xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
         }
    }
}

DELETE请求:

{
    "request": {
        "method": "DELETE",
        "url": "/api/products/2" 
    },
    "response": {
        "status": 200,
		"body": "delete successfully.",		
         "headers":{
                   "x-token":" xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
         }
    }
}

URL正则请求:

{
    "request": {
        "method": "GET",
        "urlPattern": "/api/products/[0-9]+"
    },
    "response": {
        "status": 200,
		"body": "url Matcher success"
    }
}

上面的代码请求可以用/api/product/0或者api/product/1或…api/product/9

引用json文件的请求格式:

{
    "request": {
        "method": "GET",
        "url": "/api/file"
    },
    "response": {
        "status": 200,
        "bodyFileName": "file.json",
        "headers": {
            "Content-Type": "application/json",
            "Cache-Control": "max-age=86400"
        }
    }
}

本地调用格式

java mock实例 java的mock_spring boot_03

本地单元测试调用

楼主本地使用SpringBoot做一个简单的调用
controller类:

package com.example.controller;

import com.example.service.ExpertService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.UnsupportedEncodingException;

/**
 * @author create by lixiao
 * @date 2020/5/9 9:56
 * @Description
 */
@RestController
public class ExpertController {

    @Autowired
    private ExpertService expertService;


    @RequestMapping(value = "/experts")
    public String getExpertList() throws UnsupportedEncodingException {
        return expertService.getExpertList();
    }
}

service类:

package com.example.service.impl;

import com.example.service.ExpertService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.io.UnsupportedEncodingException;

/**
 * @author create by lixiao
 * @date 2020/5/9 10:20
 * @Description
 */
@Service
public class ExpertServiceImpl implements ExpertService {

    @Value("${user.endpoint}")
    private String userEndpoint;
    @Autowired
    private RestTemplate restTemplate;

    @Override
    public String getExpertList() throws UnsupportedEncodingException {

        String response = restTemplate.getForEntity(userEndpoint+"/v1/1/expert/all?page=0&size=10",String.class).getBody();
        return response;
    }
}

在application.properties中配置了一个变量:user.endpoint=http://127.0.0.1:9090

注意:如果使用RestTemplate方式调用的话,中文会出现乱码的情况,解决办法:

@Bean
public RestTemplate restTemplate() {
     RestTemplate restTemplate = new RestTemplate();
     //消息转换器列表
     List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
     //配置消息转换器StringHttpMessageConverter,并设置utf-8
     messageConverters.set(1,new StringHttpMessageConverter(StandardCharsets.UTF_8));//支持中文字符集,默认ISO-8859-1,支持utf-8

     return restTemplate;
 }

结束语
这个是mock service一个简单的使用指南,希望对各位有一定的帮助!