RestTemplate客戶端測試
- publicclass MockServerClientTest extends AbstractClientTest {
- private MockRestServiceServer mockServer;
- @Before
- publicvoid setUp() throws Exception {
- super.setUp();
- //模擬一個伺服器
- mockServer = createServer(restTemplate);
- }
- @Test
-
public
- String uri = baseUri + "/{id}";
- Long id = 1L;
- User user = new User();
- user.setId(1L);
- user.setName("zhang");
- String userJson = objectMapper.writeValueAsString(user);
-
String requestUri = UriComponentsBuilder.fromUriString(uri).buildAndExpand(id).toUriString();
- //新增伺服器端斷言
- mockServer
- .expect(requestTo(requestUri))
- .andExpect(method(HttpMethod.GET))
- .andRespond(withSuccess(userJson, MediaType.APPLICATION_JSON));
- //2、訪問URI(與API互動)
-
ResponseEntity<User> entity = restTemplate.getForEntity(uri, User.class
- //3.1、客戶端驗證
- assertEquals(HttpStatus.OK, entity.getStatusCode());
- assertThat(entity.getHeaders().getContentType().toString(), containsString(MediaType.APPLICATION_JSON_VALUE));
- assertThat(entity.getBody(), hasProperty("name", is("zhang")));
- //3.2、伺服器端驗證(驗證之前新增的伺服器端斷言)
- mockServer.verify();
- }
- //省略其他,請參考github
- }
測試步驟:
1、準備測試環境
首先建立RestTemplate,然後通過MockRestServiceServer.createServer(restTemplate)建立一個Mock Server,其會自動設定restTemplate的requestFactory為RequestMatcherClientHttpRequestFactory(restTemplate傳送請求時都通過ClientHttpRequestFactory建立ClientHttpRequest)。
2、呼叫API
即restTemplate.getForEntity(uri, User.class, id)訪問rest web service;
3、斷言驗證
3.1、客戶端請求斷言驗證
如mockServer.expect(requestTo(requestUri)).andExpect(method(HttpMethod.GET)):即會驗證之後通過restTemplate傳送請求的uri是requestUri,且請求方法是GET;
3.2、服務端響應斷言驗證
首先通過mockServer.andRespond(withSuccess(new ObjectMapper().writeValueAsString(user), MediaType.APPLICATION_JSON));返回給客戶端響應資訊;
然後restTemplate就可以得到ResponseEntity,之後就可以通過斷言進行驗證了;
4、 解除安裝測試環境
2.4 瞭解測試API
MockRestServiceServer
用來建立模擬伺服器,其提供了createServer(RestTemplate restTemplate),傳入一個restTemplate即可建立一個MockRestServiceServer;在createServer中:
- MockRestServiceServer mockServer = new MockRestServiceServer();
- RequestMatcherClientHttpRequestFactory factory = mockServer.new RequestMatcherClientHttpRequestFactory();
- restTemplate.setRequestFactory(factory);
RequestMatcher/MockRestRequestMatchers
RequestMatcher用於驗證請求資訊的驗證器,即RestTemplate傳送的請求的URI、請求方法、請求的Body體內容等等;spring mvc測試框架提供了很多***RequestMatchers來滿足測試需求;類似於《Spring MVC測試框架詳解——服務端測試》中的***ResultMatchers;注意這些***RequestMatchers並不是ResultMatcher的子類,而是返回RequestMatcher例項的。Spring mvc測試框架為了測試方便提供了MockRestRequestMatchers靜態工廠方法方便操作;具體的API如下:
RequestMatcher anything():即請求可以是任何東西;
RequestMatcher requestTo(final Matcher<String> matcher)/RequestMatcher requestTo(final String expectedUri)/RequestMatcher requestTo(final URI uri):請求URI必須匹配某個Matcher/uri字串/URI;
RequestMatcher method(final HttpMethod method):請求方法必須匹配某個請求方法;
RequestMatcher header(final String name, final Matcher<? super String>... matchers)/RequestMatcher header(final String name, final String... expectedValues):請求頭必須匹配某個Matcher/某些值;
ContentRequestMatchers content():獲取內容匹配器,然後可以通過如contentType(String expectedContentType)進行ContentType匹配等,具體請參考javadoc;
JsonPathRequestMatchers jsonPath(String expression, Object ... args)/RequestMatcher jsonPath(String expression, Matcher<T> matcher):獲取Json路徑匹配器/直接進行路徑匹配,具體請參考javadoc;
XpathRequestMatchers xpath(String expression, Object... args)/XpathRequestMatchers xpath(String expression, Map<String, String> namespaces, Object... args):獲取Xpath表示式匹配器/直接進行Xpath表示式匹配,具體請參考javadoc;
ResponseCreator/MockRestResponseCreators
ResponseCreator用於建立返回給客戶端的響應資訊,spring mvc提供了靜態工廠方法MockRestResponseCreators進行操作;具體的API如下:
DefaultResponseCreator withSuccess() :返回給客戶端200(OK)狀態碼響應;
DefaultResponseCreator withSuccess(String body, MediaType mediaType)/DefaultResponseCreator withSuccess(byte[] body, MediaType contentType)/DefaultResponseCreator withSuccess(Resource body, MediaType contentType):返回給客戶端200(OK)狀態碼響應,且返回響應內容體和MediaType;
DefaultResponseCreator withCreatedEntity(URI location):返回201(Created)狀態碼響應,並返回響應頭“Location=location";
DefaultResponseCreator withNoContent() :返回204(NO_CONTENT)狀態碼響應;
DefaultResponseCreator withBadRequest() :返回400(BAD_REQUEST)狀態碼響應;
DefaultResponseCreator withUnauthorizedRequest() :返回401(UNAUTHORIZED)狀態碼響應;
DefaultResponseCreator withServerError() :返回500(SERVER_ERROR)狀態碼響應;
DefaultResponseCreator withStatus(HttpStatus status):設定自定義狀態碼;
對於DefaultResponseCreator還提供瞭如下API:
DefaultResponseCreator body(String content) /DefaultResponseCreator body(byte[] content)/DefaultResponseCreator body(Resource resource):內容體響應,對於String content 預設是UTF-8編碼的;
DefaultResponseCreator contentType(MediaType mediaType) :響應的ContentType;
DefaultResponseCreator location(URI location) :響應的Location頭;
DefaultResponseCreator headers(HttpHeaders headers):設定響應頭;
2.5 測試示例
測試查詢
請參考之前的testFindById;
測試新增
提交JSON資料進行新增
- @Test
- publicvoid testSaveWithJson() throws Exception {
- User user = new User();
- user.setId(1L);
- user.setName("zhang");
- String userJson = objectMapper.writeValueAsString(user);
- String uri = baseUri;
- String createdLocation = baseUri + "/" + 1;
- mockServer
- .expect(requestTo(uri)) //驗證請求URI
- .andExpect(jsonPath("$.name").value(user.getName())) //驗證請求的JSON資料
- .andRespond(withCreatedEntity(URI.create(createdLocation)).body(userJson).contentType(MediaType.APPLICATION_JSON)); //新增響應資訊
- restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new MappingJackson2HttpMessageConverter()));
- ResponseEntity<User> responseEntity = restTemplate.postForEntity(uri, user, User.class);
- assertEquals(createdLocation, responseEntity.getHeaders().get("Location").get(0));
- assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
- assertEquals(user, responseEntity.getBody());
- mockServer.verify();
- }
提交XML資料進行新增
- @Test
- publicvoid testSaveWithXML() throws Exception {
- User user = new User();
- user.setId(1L);
- user.setName("zhang");
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- marshaller.marshal(user, new StreamResult(bos));
- String userXml = bos.toString();
- String uri = baseUri;
- String createdLocation = baseUri + "/" + 1;
- mockServer
- .expect(requestTo(uri)) //驗證請求URI
- .andExpect(xpath("/user/name/text()").string(user.getName())) //驗證請求的JSON資料
- .andRespond(withCreatedEntity(URI.create(createdLocation)).body(userXml).contentType(MediaType.APPLICATION_XML)); //新增響應資訊
- restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new Jaxb2RootElementHttpMessageConverter()));
- ResponseEntity<User> responseEntity = restTemplate.postForEntity(uri, user, User.class);
- assertEquals(createdLocation, responseEntity.getHeaders().get("Location").get(0));
- assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
- assertEquals(user, responseEntity.getBody());
- mockServer.verify();
- }
測試修改
- @Test
- publicvoid testUpdate() throws Exception {
- User user = new User();
- user.setId(1L);
- user.setName("zhang");
- String uri = baseUri + "/{id}";
- mockServer
- .expect(requestTo(uri)) //驗證請求URI
- .andExpect(jsonPath("$.name").value(user.getName())) //驗證請求的JSON資料
- .andRespond(withNoContent()); //新增響應資訊
- restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new MappingJackson2HttpMessageConverter()));
- ResponseEntity responseEntity = restTemplate.exchange(uri, HttpMethod.PUT, new HttpEntity<>(user), (Class) null, user.getId());
- assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());
- mockServer.verify();
- }
測試刪除
-
相關推薦
RestTemplate客戶端測試
publicclass MockServerClientTest extends AbstractClientTest { private MockRestServiceServer mockServer; @Before publicvoid set
python--DenyHttp項目(2)--ACM監考客戶端測試版(1階段完成總結)
tdi text class 測試版 window etl operate comm decode 客戶端: ‘‘‘ DenyManager.py 調用客戶端與客戶端界面 ‘‘‘ from DenyClient import * from DenyGui import
HBase的java客戶端測試(二)---DML操作
返回 opera dmi for aos nbsp 多個 條件 node 測試準備 【首先同步時間:】 for node in CloudDeskTop master01 master02 slave01 slave02 slave03;do ssh $node "dat
無線 iphone客戶端測試白皮書(三)
同名 一次 消息推送 自動跳轉 資源 快速 簡單 通訊 一個數據庫 7 、 PUSH 測試 1) 檢查 push 消息是否按照指定的業務規則發送 2) 檢查不接受推送消息時,檢查用戶不會再接收到 push. 3) 如果用戶設置了免打擾的時間段,檢查在免打擾時間段內,用戶接收
安卓客戶端測試總結
完成後 在線 數字 短信 版本 在線升級 刪除 取消 並且 一.安裝測試 1.真機上安裝卸載,不同渠道第方軟件(91,豌豆莢,小米商城,等) 2.手機卡/SD卡,.不同的IOS和安卓版本 3.安裝過程中取消,空間不足 4.安裝過程來電,短信,完成後,是否繼續 5.卸載後是否
2008 R2部署SVN及WIN7客戶端測試
rto src fde als images 並設置相應的權限 .com visualsvn ads 一、從官網(https://www.visualsvn.com/server/download/) 下載服務端安裝包 從(https://tortoisesvn.net/d
WINDBG常用方法【紀念客戶端測試】
查看 所有 輸入 關鍵字 生成 過程 pac 不一定 ace 浸沒在windows客戶端測試好幾年了,雖然使用過,但是就差一篇總結文章。 前言:windbg大家都很熟悉,它是做windows系統客戶端測試的QA人員很應該掌握的定位程序崩潰原因的工具, 網上也有很多資料,
這是進行客戶端測試,發起為OLW
aci line eight spl 9.png .cn mil clas wid 這是進行客戶端測試,發起為OLWasdfasdfasda sdsadf這是進行客戶端測試,發起為OLW
基於CAS的單點登入SSO[4]: 加入兩個CAS客戶端測試單點登入
基於CAS的單點登入SSO[4]: 加入兩個CAS客戶端測試單點登入 作者:家輝,日期:2017-08-22 CSDN部落格: http://blog.csdn.net/gobitan 摘要:本系列的前三篇文章分別搭建了基於CAS的單點登入伺服器,並讓伺
svn伺服器搭建和svn客戶端測試
本教程是在centos7作業系統下搭建svn伺服器,本地通過下載TortoiseSVN安裝包,安裝完成後,即可在本地檢出svn伺服器上的專案,也可以訪問網上其他svn伺服器上的專案。 一.在阿里雲伺服器上搭建svn(centos7): 1.通過yum命令安裝svnserve:
swoole_http_server客戶端測試
測試方法: http_server.php 檔案內容 <?php // use Swoole\Http\Server; // $http = new Server("0.0.0.0",9501); 例項化例子 $http = new swoole_http_server("0.0.0.0",
docker安裝fastdfs與java客戶端測試
一、docker 安裝FastDFS 1、拉取映象 docker pull morunchang/fastdfs 2、建立並啟動tracker容器 docker run -d --name=tracker -v /home/fastdfs_docker/fdfs/tracker:/da
WCF初探--命令列引數啟動 WcfTestClient 免寫客戶端測試
WcfTestClient 是VS 開發環境自帶的一個wcf 客戶端。在VS 的安裝目錄下。在除錯WCF 服務時,可以啟動來幫助除錯。 啟動方法有3種': 1、到其所在路徑(Visual Studio安裝路徑\Common7\IDE\WcfTestClient.e
總結:iOS 和Android客戶端測試區別
訊息推送: 1.推送渠道: 1.1 iOS走iOS自帶的渠道進行系統內推送,應用內和應用外推送無明顯差別,均可以收到push資訊。 1.2 安卓由於谷歌推送服務在國內被牆,無法統一推送渠道,所以一般比較常用第三方推送服務 1.2.1安卓應用外(
elasticsearch-java客戶端測試
edge bool testin ram ring update pre dsquery name 1、環境準備 (1)添加依賴 <dependency> <groupId>org.elasticsearch.client&
OPC UA客戶端測試連線工具(KepOPCUA)
KepOPCUA是基於python opc ua開發的UA客戶端連線測試工具,目前支援KepServerEX6的UA伺服器的測試連線讀取,採用訂閱的方式獲取您想要的資料,具體操作步驟如下所示: 1、配置您的KepServerEX UA伺服器
mosquitto1.4 websocket js客戶端測試
首先先上個效果圖: 埠跟地址自己修改,可以在config.js裡面配置後再html裡面去呼叫。 html的程式碼: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE htm
WebService_03使用CXF方式搭建一個簡單的客戶端測試服務端
1 需要一個官方提供的CXF工具 2 配置環境變數 3 執行dos命令 wsdl2java -p 包路經 -client 服務端的地址 必須精確到wsdl wsdl2java -p com.mr.service -client http://127.0.0.1/
無線 iphone客戶端測試白皮書(一)
做無線客戶端測試時,專案流程有區別嗎 ? 無線客戶端的專案測試流程與 PC 測試基本一樣的,只是在對 UI 這塊,要求更高,需要更加註重使用者體驗。。對於一個小小的螢幕,如何讓使用者使用更加輕便、簡潔、易用,包括整個 app 的色調搭配,是否會讓使用者看了有疲勞感,都是
客戶端測試(十五)
在Django中,django.test.Client類充當一個虛擬的網路瀏覽器,可以測試檢視(views)與Django的應用程式以程式設計方式互動。 Django.test.Client類可以做的事情如下: 1.模擬“GET”和“POST”