轉載自:https://blog.csdn.net/heymysweetheart/article/details/52227379;(注,這個不是很符合我的要求,它主要的作用是可以通過簡單的代碼就能filter對方的請求options,然后做出對應的響應;而我需要的是一個能夠開啟為http服務端來測試客戶端發來的http請求的工具,然后順便看到了這篇感覺以后可能也會用到)
前言
進行單元測試時,必須要mock掉第三方的依賴調用,而mockserver提供了足夠的api來支持這種http的mock,現在簡單介紹如何使用mockserver進行http接口mock。
依賴
- mockserver依賴
<dependency><groupId>org.mock-server</groupId><artifactId>mockserver-netty</artifactId><version>3.10.4</version></dependency>
- httpclient依賴
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.3</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.3.2</version></dependency>
httpclient的版本可能會出現不一致的情況,拋出異常,以上的這個版本匹配是沒有異常的組合。
舉例
package com.yuliang.dubbo.service;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.junit.Rule;import org.junit.Test;import org.mockserver.client.server.MockServerClient;import org.mockserver.junit.MockServerRule;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import static org.hamcrest.CoreMatchers.equalTo;import static org.hamcrest.MatcherAssert.assertThat;import static org.mockserver.model.HttpRequest.request;import static org.mockserver.model.HttpResponse.response;/*** Created by leo on 16/8/16.*/public class MockServerTest {@Rulepublic MockServerRule server = new MockServerRule(this, 5000);@Testpublic void testMockServer() throws IOException {MockServerClient mockClient = new MockServerClient("localhost", 5000);String expected = "{ message: 'incorrect username and password combination' }";mockClient.when(request().withPath("/hello/John").withMethod("GET")// .withHeader(new Header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN))// .withQueryStringParameter(new Parameter("my-token", "12345"))).respond(response().withStatusCode(200).withBody(expected));CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet("http://localhost:5000/hello/John");CloseableHttpResponse response = client.execute(httpGet);//驗證輸出是否是正確InputStream content = response.getEntity().getContent();InputStreamReader inputStreamReader = new InputStreamReader(content);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String responseText = bufferedReader.readLine();assertThat(responseText, equalTo(expected));}}
-
mock http post請求
@Testpublic void testPostMockServer() throws IOException {MockServerClient mockClient = new MockServerClient("localhost", 5000);String expected = "You have logged in successfully.";mockClient.when(request().withPath("/hello/John").withMethod("POST").withHeader(new Header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN))// .withQueryStringParameter(new Parameter("my-token", "12345")).withBody("username=foo&password=123456")).respond(response().withStatusCode(200).withBody(expected));CloseableHttpClient client = HttpClients.createDefault();HttpPost httpPost = new HttpPost("http://localhost:5000/hello/John");httpPost.addHeader("Accept", "text/plain");ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();nameValuePairs.add(new BasicNameValuePair("username", "foo"));nameValuePairs.add(new BasicNameValuePair("password", "123456"));httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));CloseableHttpResponse response = client.execute(httpPost);//驗證輸出是否是正確InputStream content = response.getEntity().getContent();InputStreamReader inputStreamReader = new InputStreamReader(content);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String responseText = bufferedReader.readLine();assertThat(responseText, equalTo(expected));}
