转载:http://blog.csdn.net/vite_s/article/details/54583243

前面一篇介绍了如何用mockito来测试我们的一些异步任务,例如网络请求时候的异步回调。 
现在做进一步的介绍,一个模拟我们的服务器的东东–moco

先运行起来

请先下载这个文件moco.jar,接着,在我们的桌面新建一个文件data.json,用记事本打开,粘贴下面的东东 ,具体意思后面介绍

[{ "request" : { "uri" : "/hello" }, "response" : { "text" : "Hello  World !!!" } } ]

保存好,然后打开我们的终端或者CMD。 
输入下面的命令

java -jar moco-runner-0.10.2-standalone.jar start -p 5638 -c data.json

我比较简单粗暴,直接把桌面文件拉过去,CMD自动填好地址,所以看到都是Desktop上的。 
回车,确认后,会有下面的信息

INFO Server is started at 5638
INFO Shutdown port is 52384

所以现在,我们打开我们的游览器, 输入

http://localhost:5638/hello

理论上没有出错,那么返回的就是hello world!!! 
如下: 

解释:

java -jar moco-runner-0.10.2-standalone.jar start -p 5638 -c data.json

这个命令的意思是要mock监听本地的5638端口,对应的请求返回的数据在我们的data.json里面。 
当有网络请求到来的时候,我们的mock就会去查data.json,把requesthello对应的数据返回, 
我们写的是 Hello World !!!,所以游览器返回这个。

如果没有这个请求,就返回空。

如果要添加新的请求的,可以这样写

[{"request":{ "uri": "/hello"}, "response" : { "text": "Hello World" }}  ,
{"request":{ "uri": "/go"}, "response": { "text" : "go away !!!" }} ]

加个逗号接着复制多一份,改下请求的uri。ok,就这样,是不是很简单的感觉?? 
那么更复杂的请求怎么办呢?例如有post数据的情况。

复杂的请求

显然我们的请求确实可能这么简单,最少都是带参数的,例如要获取jack用户信息,请求像下面这样

http://localhost:5638/user/getUser?name=jack

那么我们的数据该怎么写呢?

{
"request" : {
"uri" : "/user/getUser",
"queries": { "name":"jack" }
},
"response" : {
"text" : "Hey. I'm jack"
}
}

正则表达式

对于rest风格的url,Moco支持正则匹配。

{
"request": {
"uri": {
"match": "/getUser/\\w+" }
},
"response": {
"text": "Find a boy."
}
}

POST , GET , PUT , DELETE 等方法

除了Get外,Post,Put,Delete等请求模式自然是支持的,格式如下,加多methodForms参数

{
"request" :{
"method" : "post",
"uri": "/getUser",
"forms" :{
"name" : "jack"
}
},
"response" : {
"text" : "Hi. you get jack data"
}
}

我们用postman来做模拟,返回数据正确!

Headers , Cookies , StatusCode

这个是支持特定的头的和cookies是支持的,我们需要加的就是headerscookies 和status属性,参考如下

{
"request" :{
"method" : "post",
"headers" : {
"content-type" : "application/json"
}
},
"response" :{
"status" : 200,
"text" : "bar",
"cookies" :{
"login" : "true"
},
"headers" :{
"content-type" : "application/json"
}
}
}

Json

我们对返回的数据,可以定义为Json的,格式如下

{
"request" :{
"uri": "/getJson",
"method" : "post",
},
"response" :{
"status" : 200,
"headers" :{
"content-type" : "application/json"
},
"json": {
"foo": "bar"
}
}
}

重定向

介绍一个redirect

{
"request" : { "uri" : "/redirect" },
"redirectTo" : "http://www.XXX.com"
}

延迟

我觉得这个还是个重要的属性,因为移动手机的网络环境很复杂,高RTT不是盖的,网络延迟个几十秒的那也是正常的,所以我们需要一个latency

{
"request" :{
"text" : "foo"
},
"response" :{
"latency": {
"duration": 1,
"unit": "second"
}
}
}

template

上面的请求参数的值和返回值都是固定的,这自然太过死板。 
好在从0.8版本开始,Moco提供了template功能,可以动态的返回一些参数值,虽然是beta版本。

例如:

  {
"request": {
"uri": "/getUser2"
},
"response": {
"text": {
"template": "${req.queries['name']}"
}
}
}

这样,但当我们的请求是localhost:5638/getUser2?name=nameIsJack,那么返回的数据是nameIsJack

。。。。这个CSDN真是,写一半就又崩溃了。传图片又不可以,高可用的服务器啊。

除了上面的,还有

"template": "${req.version}"
"template": "${req.method}"
"template": "${req.content}"
"template": "${req.headers['foo']}"
"template": "${req.queries['foo']}"
"template": "${req.forms['foo']}"
"template": "${req.cookies['foo']}"

这些方法上面都用过了,就不一 一解释了。

Event事件

从0.9版本开始,mock提供了event方法,什么意思呢 
有时候,我们请求一些特定接口的时候,我们可能需要去请求别的地址,从而才能完成请求。 
例如OAuth等,牵涉到第三方的情况。这时候,Event就派上大用场了

 {
"request": {
"uri" : "/event"
},
"response": {
"text": "event"
},
"on": {
"complete": {
"get" : {
"url" : "http://another_site/OAuth?xxx=xxxx"
}
}
}
}

这样我们就可以等去验证完权限部分,才返回结果。

异步请求 Asynchronous

前面的请求默认都是同步的,这意味着只有等到服务器处理完,结果才会返回给客户端 
如果你的实际情况不是这样,需要来点异步的,那么从0.9版本开始,有这个功能了,另外你还可以延迟个5秒,像这样

{
"request": {
"uri" : "/event"
},
"response": {
"text": "event"
},
"on": {
"complete": {
"async" : "true",
"latency" : 5000,
"post" : {
"url" : "http://www.baidu.com",
"content": "content"
}
}
}
}

分模块

我们的请求很显然是有很多的,例如有u 
ser模块的userApi业务,聊天模块的chatApi业务等等, 
如果把这些不同的模块的业务都写在一个文件里面,那就太难看了,为此,需要一些明智点的解决方案 
下面以一个TodoList的作为介绍

[ { "context": "/user", "include": "user.json" }, { "context": "/todo", "include": "todo.json" } ]

这样,当我们访问 
http://localhost:12306/user/create 和 http://localhost:12306/todo/getAll时候, 
会跳到后面对应的json再处理一遍

//user
[ { "request" : { "uri" : "/create" }, "response" : { "text" : "这是创建用户请求" } } ]
//todo
[ { "request" : { "uri" : "/getAll" }, "response" : { "text" : "这是获取用户所有Todo的请求" } } ]

Moco支持在全局的配置文件中引入其他配置文件,这样就可以分服务定义配置文件,便于管理。 
配置好文件,在全局文件中引入即可: 
全局配置如下:

java -jar moco-runner-standalone.jar start -p 5638 -g data.json

注意,此时需要通过参数 -g 在加载全局配置文件。,使用的不是-c

否则配置文件解析会报错。

模拟服务器MockServer之Moco详细介绍的更多相关文章

  1. Java 并发专题 : Executor详细介绍 打造基于Executor的Web服务器

    转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章很少有人看啊~哈~ 今天准备详细介绍java ...

  2. Moco模拟服务器实现请求&响应 (一)

    接口测试Moco工具 1.使用Moco模拟,首先需要下载Moco 的jar 包,下载链接: http://central.maven.org/maven2/com/github/dreamhead/m ...

  3. Android manifest之manifest标签详细介绍

    AndroidManifest详细介绍 本文主要对AndroidManifest.xml文件中各个标签进行说明.索引如下: 概要PART--01 manifest标签PART--02 安全机制和per ...

  4. snoopy(强大的PHP采集类) 详细介绍

    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单,可以用来开发一些采集程序和小偷程序,本文章详细介绍snoopy的使用教程. Snoopy的一些特点: 抓取网页的内容 fe ...

  5. WEB开发:如何用js来模拟服务器的ajax响应,不依赖服务器来编写前端代码

    一.问题的提出 目前web前端开发,主流的思路是: 1)编写静态的html文件(不使用模板技术,与服务器无关) 2)页面通过ajax与服务器交互,进行数据的传输,数据格式为json格式 这里存在一个问 ...

  6. 抓包工具 - Fiddler(详细介绍)

    Fiddler的详细介绍 一.Fiddler与其他抓包工具的区别 1.Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要 ...

  7. Network-Emulator Network-Emulator-Toolkit网络模拟器使用详细介绍

    Network-Emulator-Toolkit网络模拟器使用详细介绍 by:授客 QQ:1033553122 原理介绍 图1 如上图,一个ADSL用户通过modem连接到网络,通过网络应用如IE,M ...

  8. Fiddler工具详细介绍

    百度看到Fiddler工具的详细介绍,转载收藏,侵权删,原文地址:http://blog.csdn.net/qq_21445563/article/details/51017605 前部分讲解Fidd ...

  9. kvm详细介绍

    KVM详解,太详细太深入了,经典 2016-07-18 19:56:38 分类: 虚拟化 原文地址:KVM详解,太详细太深入了,经典 作者:zzjlzx KVM 介绍(1):简介及安装 http:// ...

随机推荐

  1. Java面试题之类加载器有哪些?什么是双亲委派模型

    类加载器有哪些: 1.启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在<JAVA_HOME>\lib目录中的,或被-Xbootclasspath参数所指 ...

  2. zjoi2018day1 游记

    3.18 这一天乘车来到衢州,这已经是第四次了,来衢州二中考过两次普及,一次提高,都不是特别好. 到了以后先去了宾馆,是在帝京,和NOIP一样的酒店,连房间都是隔壁,然后一进去就连上了隔壁的WIFI ...

  3. WinSetupFromUSB制作多系统U盘引导启动

    重装系统有各种方式,比较常见的有做系统引导U盘.刻录PE.硬盘一键安装等.但是有很多缺点,国内大部分用的Ghost系统,内含各种捆绑软件,系统极其不安全.稳定,另外制作U盘启动也只能做一个系统的安装盘 ...

  4. 我们曾经心碎的C#之 第一章.我的第一个C#程序

    第一章.      C#入门 1.1        .NET与C#            001..NET是Microsoft.NET的简称,是基于Windows平台的一种技术            ...

  5. 支持 XML 序列化的 Dictionary

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  6. 【IDEA】IDEA设置修改完JS和JSP不用重启的办法(IDEA热部署)

    修改完JS和JSP不停的重启服务器真的很烦,所以设置修改完之后不用重启也生效: 前提有两个: 确保使用的是debug模式. 确保tomcat是由idea实例化的.也就是说tomcat是在idea中配置 ...

  7. [HDU_3652]B-number

    题目描述 A wqb-number, or B-number for short, is a non-negative integer whose decimal form contains the ...

  8. [Oracle] 关系型数据库排序算法和数据结构以及关联查询

    关系型数据库排序算法和数据结构以及关联查询 1. Merge sort 理解merge sort算法将有助于更好地理解数据库join操作 - merge join 算法逻辑 将2个有序的大小为N/2的 ...

  9. 1.Centos-Docker安装和使用

    1.安装docker yum install -y epel-release yum install -y docker-io 如果需要安装最新的docker,最好将系统升级到最新版 yum inst ...

  10. 鸭子-策略模式(Strategy)

    前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介绍设计模式的第一篇,所以肩负着确定这个系列风格的历史重任,它在我脑袋里默默地酝酿了好多天,却只搜刮出了一点儿不太清晰的轮廓,可是时间 ...