转载: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. c#网络编程-第一章

    1.需求 获得网页数据,并填充到webbrowser空间中 2.代码示例 private void button1_Click_1(object sender, EventArgs e) { //1. ...

  2. 自以为是而已,不知道它是什么 window.onload 放执行

    var $=jQuery=function(onload){window.onload=onload();} jQuery(function(){alert(2);}); $(function(){a ...

  3. 颜色混合opengl--glBlendFunc函数

    http://www.cnblogs.com/ylwn817/archive/2012/09/07/2675285.html 颜色混合opengl--glBlendFunc函数 原文:http://b ...

  4. 华为上机测试题(Excel表格纵列字母数字转换-java)

    PS:这是我刚做的一道题,题目不难,满分60,得分40,大家看看哪里有问题,欢迎提意见,感谢! /* * 题目:Excel表格纵列字母数字转换 * 描述: 在Excel中列的编号为A-Z,AA-AZ, ...

  5. sql server判断数据库、表、列、视图是否存在

    1 判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名') drop database [数据库名] 2 判断表是否 ...

  6. corosync基本使用

    相关rpm: corosync-2.4.0-4.el6.x86_64.rpm The Corosync Cluster Engine and Application Programming Inter ...

  7. (转)MYSQL 的 WITH ROLLUP

    使用 GROUP BY 的 WITH ROLLUP 字句可以检索出更多的分组聚合信息,它不仅仅能像一般的 GROUP BY 语句那样检索出各组的聚合信息,还能检索出本组类的整体聚合信息. 下面我们的例 ...

  8. string那些事之replace

    /* 用法一: 用str替换指定字符串从起始位置pos开始 长度为为len的字符串 string &replace(size_t pos, size_t len, const string&a ...

  9. Educational Codeforces Round 33 (Rated for Div. 2) C. Rumor【并查集+贪心/维护集合最小值】

    C. Rumor time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  10. Django QuerySet 进阶

    QuerySet 进阶 阅读本文你可以学习到什么 1. 查看 Django queryset 执行的 SQL(1部分) 2. 获得的查询结果直接以类似list方式展示(2,3 部分) 3. 如何在dj ...