由于公司最近需要做挡板,所以研究了下Mock server.后期做成一个工具,整合到平台。
一:环境搭建
大家可以看http://www.mock-server.com/mock_server/running_mock_server.html,官网上引入的相应的jar包和插件到pom.xml中.
二:运行环境
mock server 主要分为两种启动方式。
1.通过配置文件启动(配置文件主要也有两种)
mockserver:run
mockserver:runForked 和mockserver:stopForked
利用maven执行相应的命令。mockserver:run 启动服务,只要服务不关,这个就是一直可以运行。mockserver:runForked 和mockserver:stopForked 是成对出现。其中有个配置需要注意下pom.xml里面。
`<configuration>
<serverPort>1080</serverPort>
<proxyPort>1090</proxyPort>
<logLevel>DEBUG</logLevel>
<initializationClass>test.mock.testmock</initializationClass>
</configuration>`
本地启动的服务端口,代理端口、日志等级、初始化的类。其中初始化的类 是需要自己实现ExpectationInitializer接口。
`package test.mock;
import org.mockserver.client.server.MockServerClient;
import org.mockserver.initialize.ExpectationInitializer;
import org.mockserver.matchers.TimeToLive;
import org.mockserver.matchers.Times;
import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.HttpResponse.response;
public class testmock implements ExpectationInitializer{
public void initializeExpectations(MockServerClient mockServerClient) {
// TODO Auto-generated method stub
new MockServerClient("localhost", 1080)
.when(
request()
.withMethod("POST")
.withPath("/login"),
Times.unlimited(), TimeToLive.unlimited()
)
.respond(
response()
.withStatusCode(302)
.withBody("test_initializer_response_body")
);
}
}`
2.代码中启动
`package test.mock;
import org.junit.Before;
import org.junit.Test;
import org.mockserver.integration.ClientAndProxy;
import org.mockserver.integration.ClientAndServer;
import org.mockserver.matchers.TimeToLive;
import org.mockserver.matchers.Times;
import org.mockserver.socket.PortFactory;
import org.mockserver.model.HttpRequest;
import org.mockserver.model.RegexBody;
import static org.mockserver.integration.ClientAndServer.startClientAndServer;
import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.HttpResponse.response;
public class testclientstart {
private static final int SERVER_HTTP_PORT = PortFactory.findFreePort();
private ClientAndProxy proxy;
private ClientAndServer mockServer;
public void startProxy() {
mockServer = startClientAndServer(SERVER_HTTP_PORT);
System.out.println(SERVER_HTTP_PORT);
//proxy = startClientAndProxy(1090);
}
public void shouldLoadListOfBooks() throws Exception {
// given
mockServer
.when(
request()
.withPath("/[a-z]*_get_books")
.withBody(new RegexBody("username[a-z]{4}"))
, Times.unlimited(), TimeToLive.unlimited()
)
.respond(
response()
.withBody("test")
);
mockServer
.when(
request()
.withPath("/get")
, Times.unlimited(), TimeToLive.unlimited()
)
.respond(
response()
.withBody("test")
);
}
public void removeRequest(){
HttpRequest request = new HttpRequest().withPath("/get");
mockServer.clear(request);
}
public static void main(String[] args) {
testclientstart t = new testclientstart();
try {
t.startProxy();
t.shouldLoadListOfBooks();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("-----------------------------------------------------------------");
t.removeRequest();
}
}
`
httprequest.withpath 可以加正则,也可以直接path路径。.withBody()可以加正则,也可以直接内容。mocksever.clear 可以直接根据httprequest 讲已经配置的mock清除。
mockserver源码:https://github.com/jamesdbloom/mockserver
第一次弄,很多地方都是盲人摸象。欢迎多多指教