1. 程式人生 > >RestTemplate客戶端測試

RestTemplate客戶端測試

  1. publicclass MockServerClientTest extends AbstractClientTest {  
  2.     private MockRestServiceServer mockServer;  
  3.     @Before
  4.     publicvoid setUp() throws Exception {  
  5.         super.setUp();  
  6.         //模擬一個伺服器
  7.         mockServer = createServer(restTemplate);  
  8.     }  
  9.     @Test
  10.     public
    void testFindById() throws JsonProcessingException {  
  11.         String uri = baseUri + "/{id}";  
  12.         Long id = 1L;  
  13.         User user = new User();  
  14.         user.setId(1L);  
  15.         user.setName("zhang");  
  16.         String userJson = objectMapper.writeValueAsString(user);  
  17.         String requestUri = UriComponentsBuilder.fromUriString(uri).buildAndExpand(id).toUriString();  
  18.         //新增伺服器端斷言
  19.         mockServer  
  20.                 .expect(requestTo(requestUri))  
  21.                 .andExpect(method(HttpMethod.GET))  
  22.                 .andRespond(withSuccess(userJson, MediaType.APPLICATION_JSON));  
  23.         //2、訪問URI(與API互動)
  24.         ResponseEntity<User> entity = restTemplate.getForEntity(uri, User.class
    , id);  
  25.         //3.1、客戶端驗證
  26.         assertEquals(HttpStatus.OK, entity.getStatusCode());  
  27.         assertThat(entity.getHeaders().getContentType().toString(), containsString(MediaType.APPLICATION_JSON_VALUE));  
  28.         assertThat(entity.getBody(), hasProperty("name", is("zhang")));  
  29.         //3.2、伺服器端驗證(驗證之前新增的伺服器端斷言)
  30.         mockServer.verify();  
  31.     }  
  32.     //省略其他,請參考github
  33. }  

測試步驟:

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中:

  1. MockRestServiceServer mockServer = new MockRestServiceServer();  
  2. RequestMatcherClientHttpRequestFactory factory = mockServer.new RequestMatcherClientHttpRequestFactory();  
  3. restTemplate.setRequestFactory(factory);  
即模擬一個ClientHttpRequestFactory,然後設定回RestTemplate,這樣所有傳送的請求都會到這個MockRestServiceServer。拿到MockRestServiceServer後,接著就需要新增請求斷言和返回響應,然後進行驗證。

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資料進行新增

  1. @Test
  2. publicvoid testSaveWithJson() throws Exception {  
  3.     User user = new User();  
  4.     user.setId(1L);  
  5.     user.setName("zhang");  
  6.     String userJson = objectMapper.writeValueAsString(user);  
  7.     String uri = baseUri;  
  8.     String createdLocation = baseUri + "/" + 1;  
  9.     mockServer  
  10.             .expect(requestTo(uri))  //驗證請求URI
  11.             .andExpect(jsonPath("$.name").value(user.getName())) //驗證請求的JSON資料
  12.             .andRespond(withCreatedEntity(URI.create(createdLocation)).body(userJson).contentType(MediaType.APPLICATION_JSON)); //新增響應資訊
  13.     restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new MappingJackson2HttpMessageConverter()));  
  14.     ResponseEntity<User> responseEntity = restTemplate.postForEntity(uri, user, User.class);  
  15.     assertEquals(createdLocation, responseEntity.getHeaders().get("Location").get(0));  
  16.     assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());  
  17.     assertEquals(user, responseEntity.getBody());  
  18.     mockServer.verify();  
  19. }  

提交XML資料進行新增

  1. @Test
  2. publicvoid testSaveWithXML() throws Exception {  
  3.     User user = new User();  
  4.     user.setId(1L);  
  5.     user.setName("zhang");  
  6.     ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  7.     marshaller.marshal(user, new StreamResult(bos));  
  8.     String userXml = bos.toString();  
  9.     String uri = baseUri;  
  10.     String createdLocation = baseUri + "/" + 1;  
  11.     mockServer  
  12.             .expect(requestTo(uri))  //驗證請求URI
  13.             .andExpect(xpath("/user/name/text()").string(user.getName())) //驗證請求的JSON資料
  14.             .andRespond(withCreatedEntity(URI.create(createdLocation)).body(userXml).contentType(MediaType.APPLICATION_XML)); //新增響應資訊
  15.     restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new Jaxb2RootElementHttpMessageConverter()));  
  16.     ResponseEntity<User> responseEntity = restTemplate.postForEntity(uri, user, User.class);  
  17.     assertEquals(createdLocation, responseEntity.getHeaders().get("Location").get(0));  
  18.     assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());  
  19.     assertEquals(user, responseEntity.getBody());  
  20.     mockServer.verify();  
  21. }  

測試修改 

  1. @Test
  2. publicvoid testUpdate() throws Exception {  
  3.     User user = new User();  
  4.     user.setId(1L);  
  5.     user.setName("zhang");  
  6.     String uri = baseUri + "/{id}";  
  7.     mockServer  
  8.             .expect(requestTo(uri))  //驗證請求URI
  9.             .andExpect(jsonPath("$.name").value(user.getName())) //驗證請求的JSON資料
  10.             .andRespond(withNoContent()); //新增響應資訊
  11.     restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new MappingJackson2HttpMessageConverter()));  
  12.     ResponseEntity responseEntity = restTemplate.exchange(uri, HttpMethod.PUT, new HttpEntity<>(user), (Class) null, user.getId());  
  13.     assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());  
  14.     mockServer.verify();  
  15. }  

測試刪除 

  1. 相關推薦

    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”