由於公司最近需要做擋板,所以研究了下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
第一次弄,很多地方都是盲人摸象。歡迎多多指教
