Mock server 本地实践

由于公司最近需要做挡板,所以研究了下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

第一次弄,很多地方都是盲人摸象。欢迎多多指教

原文地址:https://www.cnblogs.com/Keep-Going-Space/p/5765839.html