轉載: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
,把request
為hello
對應的數據返回,
我們寫的是 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等請求模式自然是支持的,格式如下,加多method
和Forms
參數
{
"request" :{
"method" : "post",
"uri": "/getUser",
"forms" :{
"name" : "jack"
}
},
"response" : {
"text" : "Hi. you get jack data"
}
}
我們用postman來做模擬,返回數據正確!
Headers , Cookies , StatusCode
這個是支持特定的頭的和cookies是支持的,我們需要加的就是headers
,cookies
和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
了
否則配置文件解析會報錯。