1. 程式人生 > >MockMvc詳解——SpringMVC單元測試

MockMvc詳解——SpringMVC單元測試

  MockMvc - SpringMVC單元測試的獨立測試: 一、簡介 為何使用MockMvc?         對模組進行整合測試時,希望能夠通過輸入URL對Controller進行測試,如果通過啟動伺服器,建立http client進行測試,這樣會使得測試變得很麻煩,比如,啟動速度慢,測試驗證不方便,依賴網路環境等,所以為了可以對Controller進行測試,我們引入了MockMVC。         MockMvc實現了對Http請求的模擬,能夠直接使用網路的形式,轉換到Controller的呼叫,這樣可以使得測試速度快、不依賴網路環境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統一而且很方便。 二、
測試邏輯
  1. MockMvcBuilder構造MockMvc的構造器
  2. mockMvc呼叫perform,執行一個RequestBuilder請求,呼叫controller的業務處理邏輯
  3. perform返回ResultActions,返回操作結果,通過ResultActions,提供了統一的驗證方式
  4. 使用StatusResultMatchers對請求結果進行驗證
  5. 使用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:
  1. MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根據uri模板和uri變數值得到一個GET請求方式的RequestBuilder,如果在controller的方法中method選擇的是RequestMethod.GET,那在controllerTest中對應就要使用
    MockMvcRequestBuilders.get
  2. post(String urlTemplate, Object... urlVariables):同get類似,但是是POST方法;
  3. put(String urlTemplate, Object... urlVariables):同get類似,但是是PUT方法;
  4. delete(String urlTemplate, Object... urlVariables) :同get類似,但是是DELETE方法;
  5. options(String urlTemplate, Object... urlVariables):同get類似,但是是OPTIONS方法;
五、ResultActions     呼叫MockMvc.perform(RequestBuilder requestBuilder)後將得到ResultActions,對ResultActions有以下三種處理:
  1. ResultActions.andExpect新增執行完成後的斷言。新增ResultMatcher驗證規則,驗證控制器執行完成後結果是否正確;
  2. ResultActions.andDo:新增一個結果處理器,比如此處使用.andDo(MockMvcResultHandlers.print())輸出整個響應結果資訊,可以在除錯的時候使用。(備註)
  3. ResultActions.andReturn表示執行完成後返回相應的結果
備註:     ResultHandler用於對處理的結果進行相應處理的,比如輸出整個請求/響應等資訊方便除錯,Spring mvc測試框架提供了MockMvcResultHandlers靜態工廠方法,該工廠提供了ResultHandler print()返回一個輸出MvcResult詳細資訊到控制檯的ResultHandler實現。 例子: String example= "{\"id\":1, \"name\":\"kqzu\"}";   mockMvc.perform(post("/user")  // 路徑             .contentType(MediaType.APPLICATION_JSON)   //用contentType表示具體請求中的媒體型別資訊,MediaType.APPLICATION_JSON表示網際網路媒體型別的json資料格式(見備註)             .content(example)               .accept(MediaType.APPLICATION_JSON)) //accept指定客戶端能夠接收的內容型別         .andExpect(content().contentType("application/json;charset=UTF-8")) //驗證響應contentType ==application/json;charset=UTF-8         .andExpect(jsonPath("$.id").value(1)) //驗證id是否為1,jsonPath的使用               .andExpect(jsonPath("$.name).value("kqzhu");  // 驗證name是否等於Zhukeqian String errorExample= "{id:1, name:kqzhu}";   MvcResult result = mockMvc.perform(post("/user")           .contentType(MediaType.APPLICATION_JSON).content(errorExample)           .accept(MediaType.APPLICATION_JSON)) //執行請求           .andExpect(status().isBadRequest()) //400錯誤請求,  status().isOk() 正確  status().isNotFound() 驗證控制器不存在         .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 : 需要在表單中進行檔案上傳時,就需要使用該格式
六、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):得到非同步執行的結果;