模擬服務器MockServer之Moco詳細介紹


轉載: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

否則配置文件解析會報錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM