背景介绍
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。启动成功如下图:
3.mock服务目录:当执行了上面Mock服务启动时,会在该jar 同等目录下生成_files和mappings。
mappings目录存放完整的请求文件,_files可以存放大的json格式文件。文件格式必须要是.json结尾。每一次改动json文件都需要重启WireMock服务!!!
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"
}
}
}
本地调用格式
本地单元测试调用
楼主本地使用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一个简单的使用指南,希望对各位有一定的帮助!