{"id":1310,"date":"2018-03-07T16:42:01","date_gmt":"2018-03-07T08:42:01","guid":{"rendered":"http:\/\/www.yeetrack.com\/?p=1310"},"modified":"2018-03-07T16:42:01","modified_gmt":"2018-03-07T08:42:01","slug":"http-mock%e6%9c%8d%e5%8a%a1","status":"publish","type":"post","link":"https:\/\/www.yeetrack.com\/?p=1310","title":{"rendered":"Http Mock\u670d\u52a1"},"content":{"rendered":"<p>\u5728\u9879\u76ee\u5f00\u53d1\u548c\u9879\u76ee\u6d4b\u8bd5\u65f6\uff0c\u90fd\u4f1a\u9047\u5230\u4e0d\u540c\u9879\u76ee\u3001\u6a21\u5757\u76f8\u4e92\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u8c03\u7528\u65b9\u5f0f\u4e5f\u6709\u5f88\u591a\uff0c\u901a\u8fc7http\/https\u3001TCP\u8fde\u63a5\u3001RPC\u7b49\uff1b\u8fd9\u6837\u7cfb\u7edf\u4e4b\u95f4\u76f8\u4e92\u4f9d\u8d56\uff0c\u4f1a\u5f71\u54cd\u5f00\u53d1\u901f\u5ea6\uff0c\u6240\u4ee5\u57fa\u672c\u4e0a\u90fd\u662f\u91c7\u7528mock\u7684\u65b9\u5f0f\u8fdb\u884c\u5f00\u53d1\u3001\u6d4b\u8bd5\uff0c\u5373\u5148\u5199\u4e00\u4e2a\u7b26\u5408\u9884\u671f\u7684\u5047\u63a5\u53e3\uff0c\u8fdb\u884c\u8c03\u7528\u3002<br \/>\n\u5728github\u4e0a\u770b\u5230\u4e00\u4e2a\u633a\u4e0d\u9519\u7684<a href=\"http:\/\/www.mock-server.com\/#what-is-mockserver\">http mock server<\/a>\uff0c\u8fd9\u91cc\u7b80\u5355\u4ecb\u7ecd\u4e00\u4e0b\u3002<br \/>\n<!--more--><\/p>\n<p>MockServer\u53ef\u7528\u6765\u6a21\u62dfhttp\u3001https\u670d\u52a1\u3002\u5f53MockServer\u6536\u5230\u8bf7\u6c42\u540e\uff0c\u4f1a\u53bb\u5185\u5b58\u5728\u67e5\u627e\u4e4b\u524d\u914d\u7f6e\u597d\u7684\u89c4\u5219\uff0c\u5982\u679c\u5339\u914d\u4e0a\uff0c\u5c31\u8fd4\u56de\u4e4b\u524d\u6307\u5b9a\u7684\u5185\u5bb9\u3002MockServer\u652f\u6301\u4ee5\u4e0b\u52a8\u4f5c\uff1a<\/p>\n<ul>\n<li>\u8fd4\u56de\u54cd\u5e94\uff0c\u5982\u679c\u8bf7\u6c42\u547d\u4e2d\u4e86\u89c4\u5219\uff0c\u53ef\u4ee5\u8fd4\u56de\u54cd\u5e94<br \/>\n<img decoding=\"async\" src=\"http:\/\/www.mock-server.com\/images\/expectation_response_action.png\" alt=\"http:\/\/www.mock-server.com\/images\/expectation_response_action.png\" \/><\/li>\n<li>\n<p>\u8f6c\u53d1\u8bf7\u6c42\uff0c\u5982\u679c\u8bf7\u6c42\u547d\u4e2d\u4e86\u89c4\u5219\uff0c\u53ef\u4ee5\u5c06\u8bf7\u6c42\u8f6c\u53d1\u5230\u5176\u4ed6\u670d\u52a1<br \/>\n<img decoding=\"async\" src=\"http:\/\/www.mock-server.com\/images\/expectation_forward_action.png\" alt=\"http:\/\/www.mock-server.com\/images\/expectation_forward_action.png\" \/><\/p>\n<\/li>\n<li>\n<p>\u6267\u884c\u56de\u8c03\u51fd\u6570\uff0c\u5982\u679c\u8bf7\u6c42\u547d\u4e2d\u4e86\u89c4\u5219\uff0c\u8fd8\u5141\u8bb8\u52a8\u6001\u7684\u751f\u6210\u54cd\u5e94<br \/>\n<img decoding=\"async\" src=\"http:\/\/www.mock-server.com\/images\/expectation_callback_action.png\" alt=\"http:\/\/www.mock-server.com\/images\/expectation_callback_action.png\" \/><\/p>\n<\/li>\n<li>\n<p>\u8fd4\u56de\u65e0\u6548\u54cd\u5e94\u3001\u6216\u8005\u76f4\u63a5\u5173\u95ed\u8fde\u63a5<br \/>\n<img decoding=\"async\" src=\"http:\/\/www.mock-server.com\/images\/expectation_error_action.png\" alt=\"http:\/\/www.mock-server.com\/images\/expectation_error_action.png\" \/><\/p>\n<\/li>\n<li>\n<p>\u6821\u9a8c\u8bf7\u6c42\uff0c\u68c0\u67e5\u63a5\u6536\u5230\u7684\u8bf7\u6c42\u662f\u5426\u7b26\u5408\u9884\u671f<br \/>\n<img decoding=\"async\" src=\"http:\/\/www.mock-server.com\/images\/verification.png\" alt=\"http:\/\/www.mock-server.com\/images\/verification.png\" \/><\/p>\n<\/li>\n<li>\n<p>\u83b7\u53d6\u65e5\u5fd7\uff0c\u80fd\u83b7\u53d6\u8bf7\u6c42\u548c\u54cd\u5e94\u7684\u65e5\u5fd7\uff0c\u7528\u6765\u5b9a\u4f4d\u95ee\u9898<br \/>\n<img decoding=\"async\" src=\"http:\/\/www.mock-server.com\/images\/retrieve_logs.png\" alt=\"http:\/\/www.mock-server.com\/images\/retrieve_logs.png\" \/><\/p>\n<\/li>\n<\/ul>\n<h2>\u5982\u4f55\u4f7f\u7528<\/h2>\n<p><img decoding=\"async\" src=\"http:\/\/www.mock-server.com\/images\/system_under_test_with_mockserver_cropped.png\" alt=\"http:\/\/www.mock-server.com\/images\/system_under_test_with_mockserver_cropped.png\" \/><\/p>\n<ol>\n<li>MockServer\u652f\u6301\u591a\u79cd\u542f\u52a8\u65b9\u5f0f\uff0c\u5982\u4e0b\uff1a\n<ul>\n<li>\u53ef\u4ee5\u901a\u8fc7<a href=\"http:\/\/www.mock-server.com\/mock_server\/running_mock_server.html#maven_plugin\">maven plugin<\/a>\u7684\u65b9\u5f0f\u542f\u52a8<\/li>\n<li>\u53ef\u4ee5\u901a\u8fc7<a href=\"http:\/\/www.mock-server.com\/mock_server\/running_mock_server.html#client_api\">java\u4ee3\u7801<\/a>\u63a7\u5236<\/li>\n<li>\u53ef\u4ee5\u4f7f\u7528<a href=\"http:\/\/www.mock-server.com\/mock_server\/running_mock_server.html#junit_rule\">JUnit\u6846\u67b6\u4e2d\u7684@Rule<\/a>\u63a7\u5236<\/li>\n<li>\u53ef\u4ee5\u4f7f\u7528<a href=\"http:\/\/www.mock-server.com\/mock_server\/running_mock_server.html#running_from_command_line\">\u547d\u4ee4\u884c<\/a>\u542f\u52a8<\/li>\n<li>\u53ef\u4ee5\u901a\u8fc7<a href=\"http:\/\/www.mock-server.com\/mock_server\/running_mock_server.html#deployable_war\">\u90e8\u7f72war\u5305<\/a>\u542f\u52a8<\/li>\n<li>\u53ef\u4ee5\u901a\u8fc7<a href=\"http:\/\/www.mock-server.com\/mock_server\/running_mock_server.html#mockserver_node\">Node.js<\/a>\u542f\u52a8<\/li>\n<li>\u53ef\u4ee5\u901a\u8fc7<a href=\"http:\/\/www.mock-server.com\/mock_server\/running_mock_server.html#mockserver_node\">Grunt plugin<\/a>\u65b9\u5f0f\u542f\u52a8<\/li>\n<li>\u53ef\u4ee5\u901a\u8fc7<a href=\"http:\/\/www.mock-server.com\/mock_server\/running_mock_server.html#docker_container\">Docker\u65b9\u5f0f<\/a>\u542f\u52a8<\/li>\n<\/ul>\n<\/li>\n<li>\u914d\u7f6e\u54cd\u5e94\uff0cjava\u4ee3\u7801\u5982\u4e0b\uff1a\n<p>new MockServerClient(\"localhost\", 1080)<br \/>\n.when(<br \/>\n    request()<br \/>\n        .withMethod(\"POST\")<br \/>\n        .withPath(\"\/login\")<br \/>\n        .withBody(\"{username: 'foo', password: 'bar'}\")<br \/>\n)<br \/>\n.respond(<br \/>\n    response()<br \/>\n        .withStatusCode(302)<br \/>\n        .withCookie(<br \/>\n            \"sessionId\", \"2By8LOhBmaW5nZXJwcmludCIlMDAzMW\"<br \/>\n        )<br \/>\n        .withHeader(<br \/>\n            \"Location\", \"https:\/\/www.mock-server.com\"<br \/>\n        )<br \/>\n);<\/li>\n<\/ol>\n<p>\u54cd\u5e94\u5305\u62ec\u56db\u90e8\u5206\uff1a<br \/>\n+ <code>request_matcher<\/code>\uff0curl\u8def\u5f84\uff0c\u7528\u6765\u5339\u914d\u8bf7\u6c42<br \/>\n+ <code>action<\/code>\uff0c\u52a8\u4f5c\uff0c\u5305\u62ec<code>response<\/code>, <code>forward<\/code>, <code>callback<\/code>\u548c<code>error<\/code><br \/>\n+ <code>times<\/code>\uff0c\u7528\u6765\u63a7\u5236\u6b64action\u53ef\u4ee5\u8bf7\u6c42\u7684\u6b21\u6570<br \/>\n+ <code>timeToLive<\/code>,\u7528\u6765\u63a7\u5236\u54cd\u5e94\u5b58\u6d3b\u65f6\u95f4<\/p>\n<pre><code>new MockServerClient(\"localhost\", 1080)\n.when(\n    request()\n        .withPath(\"\/some\/path\"),\n    Times.once(),\n    TimeToLive.exactly(TimeUnit.SECONDS, 60L)\n)\n.respond(\n    response()\n        .withBody(\"some_response_body\")\n);\n<\/code><\/pre>\n<p>\u8fd8\u53ef\u4ee5\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\uff1a<\/p>\n<pre><code>new MockServerClient(\"localhost\", 1080)\n.when(\n    request()\n        \/\/ matches any requests those path starts with \"\/some\"\n        .withPath(\"\/some.*\")\n)\n.respond(\n    response()\n        .withBody(\"some_response_body\")\n);\n<\/code><\/pre>\n<p>\u5339\u914d\u8def\u5f84\u65f6\uff0c\u8fd8\u53ef\u4ee5\u53d6\u53cd\uff1a<\/p>\n<pre><code>new MockServerClient(\"localhost\", 1080)\n.when(\n    request()\n        \/\/ matches any requests those path does NOT start with \"\/some\"\n        .withPath(not(\"\/some.*\"))\n)\n.respond(\n    response()\n        .withBody(\"some_response_body\")\n);\n<\/code><\/pre>\n<p>\u5339\u914d\u8bf7\u6c42\u65f6\uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7\u5339\u914d\u53c2\u6570\u6765\u63a7\u5236\uff1a<\/p>\n<pre><code>new MockServerClient(\"localhost\", 1080)\n.when(\n    request()\n        .withPath(\"\/some\/path\")\n        .withQueryStringParameters(\n            param(\"[A-z]{0,10}\", \"055CA455-1DF7-45BB-8535-4F83E7266092\")\n        )\n)\n.respond(\n    response()\n        .withBody(\"some_response_body\")\n);\n<\/code><\/pre>\n<p>MockServer\u8fd8\u652f\u6301\u5404\u79cd\u914d\u7f6e\uff0c\u66f4\u591a\u53ef\u4ee5\u770b\u82f1\u6587\u6587\u6863 <a href=\"http:\/\/www.mock-server.com\/mock_server\/getting_started.html\">http:\/\/www.mock-server.com\/mock_server\/getting_started.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5728\u9879\u76ee\u5f00\u53d1\u548c\u9879\u76ee\u6d4b\u8bd5\u65f6\uff0c\u90fd\u4f1a\u9047\u5230\u4e0d\u540c\u9879\u76ee\u3001\u6a21\u5757\u76f8\u4e92\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u8c03\u7528\u65b9\u5f0f\u4e5f\u6709\u5f88\u591a\uff0c\u901a\u8fc7http\/https\u3001TCP\u8fde\u63a5\u3001RPC\u7b49\uff1b\u8fd9\u6837\u7cfb\u7edf\u4e4b\u95f4\u76f8\u4e92\u4f9d\u8d56\uff0c\u4f1a\u5f71\u54cd\u5f00\u53d1\u901f\u5ea6\uff0c\u6240\u4ee5\u57fa\u672c\u4e0a\u90fd\u662f\u91c7\u7528mock\u7684\u65b9\u5f0f\u8fdb&#46;&#46;&#46;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"pgc_sgb_lightbox_settings":"","footnotes":""},"categories":[33],"tags":[8,45,41],"class_list":["post-1310","post","type-post","status-publish","format-standard","hentry","category-coding","tag-java","tag-maven","tag-41"],"views":7832,"_links":{"self":[{"href":"https:\/\/www.yeetrack.com\/index.php?rest_route=\/wp\/v2\/posts\/1310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yeetrack.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yeetrack.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yeetrack.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yeetrack.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1310"}],"version-history":[{"count":1,"href":"https:\/\/www.yeetrack.com\/index.php?rest_route=\/wp\/v2\/posts\/1310\/revisions"}],"predecessor-version":[{"id":1311,"href":"https:\/\/www.yeetrack.com\/index.php?rest_route=\/wp\/v2\/posts\/1310\/revisions\/1311"}],"wp:attachment":[{"href":"https:\/\/www.yeetrack.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yeetrack.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yeetrack.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}