Http Mock服务

在项目开发和项目测试时,都会遇到不同项目、模块相互调用的情况,调用方式也有很多,通过http/https、TCP连接、RPC等;这样系统之间相互依赖,会影响开发速度,所以基本上都是采用mock的方式进行开发、测试,即先写一个符合预期的假接口,进行调用。
在github上看到一个挺不错的http mock server,这里简单介绍一下。

MockServer可用来模拟http、https服务。当MockServer收到请求后,会去内存在查找之前配置好的规则,如果匹配上,就返回之前指定的内容。MockServer支持以下动作:

  • 返回响应,如果请求命中了规则,可以返回响应
    http://www.mock-server.com/images/expectation_response_action.png
  • 转发请求,如果请求命中了规则,可以将请求转发到其他服务
    http://www.mock-server.com/images/expectation_forward_action.png

  • 执行回调函数,如果请求命中了规则,还允许动态的生成响应
    http://www.mock-server.com/images/expectation_callback_action.png

  • 返回无效响应、或者直接关闭连接
    http://www.mock-server.com/images/expectation_error_action.png

  • 校验请求,检查接收到的请求是否符合预期
    http://www.mock-server.com/images/verification.png

  • 获取日志,能获取请求和响应的日志,用来定位问题
    http://www.mock-server.com/images/retrieve_logs.png

如何使用

http://www.mock-server.com/images/system_under_test_with_mockserver_cropped.png

  1. MockServer支持多种启动方式,如下:
  2. 配置响应,java代码如下:

    new MockServerClient(“localhost”, 1080)
    .when(
    request()
    .withMethod(“POST”)
    .withPath(“/login”)
    .withBody(“{username: ‘foo’, password: ‘bar’}”)
    )
    .respond(
    response()
    .withStatusCode(302)
    .withCookie(
    “sessionId”, “2By8LOhBmaW5nZXJwcmludCIlMDAzMW”
    )
    .withHeader(
    “Location”, “https://www.mock-server.com”
    )
    );

响应包括四部分:
+ request_matcher,url路径,用来匹配请求
+ action,动作,包括response, forward, callbackerror
+ times,用来控制此action可以请求的次数
+ timeToLive,用来控制响应存活时间

new MockServerClient("localhost", 1080)
.when(
    request()
        .withPath("/some/path"),
    Times.once(),
    TimeToLive.exactly(TimeUnit.SECONDS, 60L)
)
.respond(
    response()
        .withBody("some_response_body")
);

还可以使用正则表达式:

new MockServerClient("localhost", 1080)
.when(
    request()
        // matches any requests those path starts with "/some"
        .withPath("/some.*")
)
.respond(
    response()
        .withBody("some_response_body")
);

匹配路径时,还可以取反:

new MockServerClient("localhost", 1080)
.when(
    request()
        // matches any requests those path does NOT start with "/some"
        .withPath(not("/some.*"))
)
.respond(
    response()
        .withBody("some_response_body")
);

匹配请求时,还可以通过匹配参数来控制:

new MockServerClient("localhost", 1080)
.when(
    request()
        .withPath("/some/path")
        .withQueryStringParameters(
            param("[A-z]{0,10}", "055CA455-1DF7-45BB-8535-4F83E7266092")
        )
)
.respond(
    response()
        .withBody("some_response_body")
);

MockServer还支持各种配置,更多可以看英文文档 http://www.mock-server.com/mock_server/getting_started.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

(Spamcheck Enabled)