MockMvc詳解


★  MockMvc - SpringMVC單元測試的獨立測試:
一、簡介
為何使用MockMvc?
        對模塊進行集成測試時,希望能夠通過輸入URL對Controller進行測試,如果通過啟動服務器,建立http client進行測試,這樣會使得測試變得很麻煩,比如,啟動速度慢,測試驗證不方便,依賴網絡環境等,所以為了可以對Controller進行測試,我們引入了MockMVC。
        MockMvc實現了對Http請求的模擬,能夠直接使用網絡的形式,轉換到Controller的調用,這樣可以使得測試速度快、不依賴網絡環境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統一而且很方便。

二、測試邏輯

MockMvcBuilder構造MockMvc的構造器;

mockMvc調用perform,執行一個RequestBuilder請求,調用controller的業務處理邏輯;

perform返回ResultActions,返回操作結果,通過ResultActions,提供了統一的驗證方式;

使用StatusResultMatchers對請求結果進行驗證;

使用ContentResultMatchers對請求返回的內容進行驗證;

三、MockMvcBuilder
MockMvc是spring測試下的一個非常好用的類,他們的初始化需要在setUp中進行。
MockMvcBuilder是用來構造MockMvc的構造器,其主要有兩個實現:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,前者繼承了后者。
① MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,將會從該上下文獲取相應的控制器並得到相應的MockMvc;
② MockMvcBuilders.standaloneSetup(Object... controllers):通過參數指定一組控制器,這樣就不需要從上下文獲取了,比如this.mockMvc = MockMvcBuilders.standaloneSetup(this.controller).build();
這些Builder還提供了其他api,可以自行百度

四、MockMvcRequestBuilders
        從名字可以看出,RequestBuilder用來構建請求的,其提供了一個方法buildRequest(ServletContext servletContext)用於構建MockHttpServletRequest;其主要有兩個子類MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如文件上傳使用),即用來Mock客戶端請求需要的所有數據。
主要API:
MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根據uri模板和uri變量值得到一個GET請求方式的RequestBuilder,如果在controller的方法中method選擇的是RequestMethod.GET,那在controllerTest中對應就要使用MockMvcRequestBuilders.get。
post(String urlTemplate, Object... urlVariables):同get類似,但是是POST方法;
put(String urlTemplate, Object... urlVariables):同get類似,但是是PUT方法;
delete(String urlTemplate, Object... urlVariables) :同get類似,但是是DELETE方法;
options(String urlTemplate, Object... urlVariables):同get類似,但是是OPTIONS方法;

五、ResultActions
    調用MockMvc.perform(RequestBuilder requestBuilder)后將得到ResultActions,對ResultActions有以下三種處理:

ResultActions.andExpect:添加執行完成后的斷言。添加ResultMatcher驗證規則,驗證控制器執行完成后結果是否正確;

ResultActions.andDo:添加一個結果處理器,比如此處使用.andDo(MockMvcResultHandlers.print())輸出整個響應結果信息,可以在調試的時候使用。

ResultActions.andReturn:表示執行完成后返回相應的結果

備注:
    ResultHandler用於對處理的結果進行相應處理的,比如輸出整個請求/響應等信息方便調試,Spring mvc測試框架提供了MockMvcResultHandlers靜態工廠方法,該工廠提供了ResultHandler print()返回一個輸出MvcResult詳細信息到控制台的ResultHandler實現

例子:


   
   
  
  
          
  1. String example= "{"id ":1, "name ":"kqzu "}";  
  2. mockMvc.perform(post( "/user")   // 路徑
  3.             .contentType(MediaType.APPLICATION_JSON)    //用contentType表示具體請求中的媒體類型信息,MediaType.APPLICATION_JSON表示互聯網媒體類型的json數據格式(見備注)
  4.             .content(example)  
  5.             .accept(MediaType.APPLICATION_JSON)) //accept指定客戶端能夠接收的內容類型 
  6.          .andExpect(content().contentType( "application/json;charset=UTF-8")) //驗證響應contentType == application/json;charset=UTF-8
  7.          .andExpect(jsonPath( "$.id").value( 1))  //驗證id是否為1,jsonPath的使用
  8.             .andExpect(jsonPath( "$.name).value("kqzhu ");  // 驗證name是否等於Zhukeqian
  9. String errorExample = "{ "id": 1, "name": "kqzhu"} ";  
  10. MvcResult result = mockMvc.perform(post("/user ")  
  11.         .contentType(MediaType.APPLICATION_JSON)
  12. .content(errorExample)  
  13.         .accept(MediaType.APPLICATION_JSON)) //執行請求  
  14.         .andExpect(status().isBadRequest()) //400錯誤請求,  status().isOk() 正確  status().isNotFound() 驗證控制器不存在
  15.         .andReturn();  //返回MvcResult

備注:使用Content-type來指定不同格式的請求信息,下面例舉在日常的開發中,常會用的若干content-type的內容格式
    例如: Content-Type: text/html;charset:utf-8;
 常見的媒體格式類型如下:
    text/html : HTML格式
    text/plain :純文本格式      
    text/xml :  XML格式 /
    image/gif :gif圖片格式    
    image/jpeg :jpg圖片格式 
    image/png:png圖片格式
   以application開頭的媒體格式類型:
   application/xhtml+xml :XHTML格式
   application/xml     : XML數據格式
   application/atom+xml  :Atom XML聚合格式    
   application/json    : JSON數據格式
   application/pdf       :pdf格式  
   application/msword  : Word文檔格式
   application/octet-stream : 二進制流數據(如常見的文件下載)
   application/x-www-form-urlencoded : <form encType=””>中默認的encType,form表單數據被編碼為key/value格式發送到服務器(表單默認的提交數據的格式)
   另外一種常見的媒體格式是上傳文件之時使用的:
    multipart/form-data : 需要在表單中進行文件上傳時,就需要使用該格式

附錄:Requests & Responses 的標識及解釋 


六、ResultMatchers 
        ResultMatcher用來匹配執行完請求后的結果驗證,其就一個match(MvcResult result)斷言方法,如果匹配失敗將拋出相應的異常,spring mvc測試框架提供了很多***ResultMatchers來滿足測試需求。
具體請百度。

七、MvcResult
        即執行完控制器后得到的整個結果,並不僅僅是返回值,其包含了測試時需要的所有信息。
MockHttpServletRequest getRequest():得到執行的請求;
MockHttpServletResponse getResponse():得到執行后的響應;
Object getHandler():得到執行的處理器,一般就是控制器;
HandlerInterceptor[] getInterceptors():得到對處理器進行攔截的攔截器;
ModelAndView getModelAndView():得到執行后的ModelAndView;
Exception getResolvedException():得到HandlerExceptionResolver解析后的異常;
FlashMap getFlashMap():得到FlashMap;
Object getAsyncResult()/Object getAsyncResult(long timeout):得到異步執行的結果;

資料:史上最全,Spring MVC測試框架詳解——服務端測試


原文:https://blog.csdn.net/kqZhu/article/details/78836275
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM