MockServer
簡(jiǎn)單介紹:
這個(gè)MockServer 提供了一些API镇饺,根據(jù)定義的Request定義和指定Response規(guī)則,生成一條Expectation稚晚,那么在請(qǐng)求該Request指定的地址的時(shí)候,會(huì)將Response指定的數(shù)據(jù)返回,用來(lái)模擬API永毅。
目前用的人應(yīng)該不多,能找到的中文介紹比較少人弓。沼死。
特性
該MockServer主要有兩個(gè)概念,分別為 MockServer和MockClients
MockServer顧名思義就是服務(wù)端應(yīng)用程序崔赌,
MockClients就是通過(guò)API 與MockServer服務(wù)端交互的程序意蛀。
MockServer 還支持Proxy,為應(yīng)用設(shè)置代理端口和代理地址健芭,并轉(zhuǎn)發(fā)到遠(yuǎn)程地址的指定端口县钥。用來(lái)分析應(yīng)用程序十分方便。
- 支持Node.js客戶端
- 支持Java客戶端
- 支持Javascript客戶端
- 支持ruby客戶端
十分強(qiáng)大
服務(wù)端是用Netty寫的慈迈,支持HTTP協(xié)議若贮,支持Websocket。
下面是官方的一些圖
https://github.com/jamesdbloom/mockserver
http://mock-server.com/
實(shí)戰(zhàn)
從github上clone該項(xiàng)目,然后checkout 5.4.1(目前最新版本)谴麦。
官方文檔非常詳細(xì)蠢沿,可惜提供的 NodeClients 和文檔 的最新版本是5.3.0。
啟動(dòng)
5.3.0 版本
java -jar ./mockserver-jetty-jar-with-dependencies.jar -serverPort 1080 -proxyPort 1090 -proxyRemotePort 80 -proxyRemoteHost www.mock-server.com
serverPort表示 MockServer的主要端口匾效,通過(guò)該端口提供的API可以創(chuàng)建規(guī)則搏予。
proxyPort表示MockServer提供的Proxy端口,通過(guò)該端口可以轉(zhuǎn)發(fā)到 proxyRemoteHost對(duì)應(yīng)的端口 proxyRemotePort弧轧。
5.4.1 版本
通過(guò)查看源碼發(fā)現(xiàn)雪侥,作者似乎將 proxyPort和主要serverPort合并成一個(gè),并且不識(shí)別ProxyPort
java -jar ./mockserver-jetty-jar-with-dependencies.jar -serverPort 1080 -proxyRemotePort 80 -proxyRemoteHost www.mock-server.com
serverPort表示 MockServer的主要端口精绎,通過(guò)該端口提供的API可以創(chuàng)建規(guī)則速缨。
同時(shí)也是Proxy端口,通過(guò)該端口可以轉(zhuǎn)發(fā)到 proxyRemoteHost對(duì)應(yīng)的端口 proxyRemotePort代乃。
創(chuàng)建Expectation
根據(jù)文檔是可以創(chuàng)建一些簡(jiǎn)易的請(qǐng)求和返回規(guī)則的旬牲。
下面以nodeClient為例子:
新建run.js
var mockServerClient = require('mockserver-client').mockServerClient;
var instance = mockServerClient("localhost", 1080);
instance.reset();
instance.mockAnyResponse({
"httpRequest": {
"method": "GET",
"path": "/view/cart",
"queryStringParameters": {
"cartId": ["055CA455-1DF7-45BB-8535-4F83E7266092"]
},
"cookies": {
}
},
"httpResponse": {
"body": "some_response_body"
}
})
.then(
function () {
console.log("expectation created");
},
function (error) {
console.log(error);
}
);
確保系統(tǒng)已經(jīng)安裝node.js 和npm.
通過(guò)下面的命令安裝 MockServer Node客戶端
npm install mockserver-node --save-dev
然后執(zhí)行 node run.js
可以看到輸出
expectation created
通過(guò)請(qǐng)求MockServer
127.0.0.1:1080/view/cart?cartId=055CA455-1DF7-45BB-8535-4F83E7266092
即可看到返回?cái)?shù)據(jù):
some_response_body
創(chuàng)建帶Callback的Expectation
var mockServerClient = require('mockserver-client').mockServerClient;
var instance = mockServerClient("localhost", 1080);
var callback = function (request) {
if (request.method === 'POST') {
console.log("Callback received BY POST")
} else {
console.log("Callback received NOT BY POST");
}
};
instance.mockWithCallback(
{
"path":"/callback"
},
callback
).then(
function () {
console.log('expectation sent');
},
function (error) {
console.log(error);
process.exit();
}
);
這里當(dāng)創(chuàng)建這個(gè)Expectation之后,訪問(wèn)
127.0.0.1:1080/callback 可以看到
輸出Callback received NOT BY POST搁吓。
這里非常令人驚嘆原茅,作者是把這個(gè)js function 作為一個(gè)client,把clientId 告訴服務(wù)端堕仔,服務(wù)端收到請(qǐng)求之后擂橘,node.js 是通過(guò)websocket 和服務(wù)端通信的,這時(shí)候摩骨,會(huì)通知客戶端通贞,客戶端收到通知之后,調(diào)用這個(gè)callback恼五。
這個(gè)callback function 在官網(wǎng)文檔 return 了一個(gè) response定義昌罩。這個(gè)似乎可以進(jìn)一步在客戶端處理,然后再次告訴服務(wù)端灾馒,來(lái)返回期望的定義茎用。不過(guò)我沒(méi)有成功實(shí)現(xiàn),會(huì)一直報(bào)錯(cuò)睬罗。
奈何技術(shù)水平有限轨功,不知道怎么才能成功調(diào)用定義的Callback來(lái)返回指定的數(shù)據(jù),不知道是文檔還是官方提供的NodeModule哪里寫的不對(duì)傅物。
通過(guò)REST API創(chuàng)建一般Expectation
通過(guò)POSTMAN 發(fā)起請(qǐng)求:
PUT 127.0.0.1:1080/expectation
{
"httpRequest": {
"path": "/somePath",
"method": "POST"
},
"httpResponse": {
"statusCode": 404,
"headers": [{
"name": "Content-Type",
"values": ["application/json"]
}, {
"name": "Cache-Control",
"values": ["no-cache, no-store"]
}],
"body": {
"type":"JSON",
"json":"{\"httpRequest\":{\"path\":\"/somePath\",\"method\":\"POST\"},\"httpResponse\":{\"statusCode\":201,\"headers\":[{\"name\":\"Content-Type\",\"values\":[\"application/json\"]},{\"name\":\"Cache-Control\",\"values\":[\"no-cache, no-store\"]}],\"body\":{\"type\":\"JSON\",\"json\":\"\"}}}"
}
}
}
這里故意把請(qǐng)求本身當(dāng)作Reponse定義夯辖,并故意返回404。
當(dāng)發(fā)起somePath請(qǐng)求時(shí)董饰,會(huì)接受到對(duì)應(yīng)的JSON蒿褂。
POST 127.0.0.1:1080/somePath
{
"httpRequest": {
"path": "/somePath",
"method": "POST"
},
"httpResponse": {
"statusCode": 404,
"headers": [{
"name": "Content-Type",
"values": ["application/json"]
}, {
"name": "Cache-Control",
"values": ["no-cache, no-store"]
}],
"body": {
"type":"JSON",
"json":""
}
}
}
但愿作者能把5.4.1的文檔補(bǔ)全圆米。
如果你也喜歡這個(gè)工具,直接私信我啄栓,可以和我一起研究娄帖。