MockMvc詳解——SpringMVC單元測試
阿新 • • 發佈:2019-01-02
★
MockMvc - SpringMVC單元測試的獨立測試:
一、簡介
為何使用MockMvc?
對模組進行整合測試時,希望能夠通過輸入URL對Controller進行測試,如果通過啟動伺服器,建立http client進行測試,這樣會使得測試變得很麻煩,比如,啟動速度慢,測試驗證不方便,依賴網路環境等,所以為了可以對Controller進行測試,我們引入了MockMVC。
MockMvc實現了對Http請求的模擬,能夠直接使用網路的形式,轉換到Controller的呼叫,這樣可以使得測試速度快、不依賴網路環境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統一而且很方便。
二、 測試邏輯
從名字可以看出,RequestBuilder用來構建請求的,其提供了一個方法buildRequest(ServletContext servletContext)用於構建MockHttpServletRequest;其主要有兩個子類MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如檔案上傳使用),即用來Mock客戶端請求需要的所有資料。
主要API:
- MockMvcBuilder構造MockMvc的構造器
- mockMvc呼叫perform,執行一個RequestBuilder請求,呼叫controller的業務處理邏輯
- perform返回ResultActions,返回操作結果,通過ResultActions,提供了統一的驗證方式
- 使用StatusResultMatchers對請求結果進行驗證
- 使用ContentResultMatchers對請求返回的內容進行驗證
-
MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根據uri模板和uri變數值得到一個GET請求方式的RequestBuilder,如果在controller的方法中method選擇的是RequestMethod.GET,那在controllerTest中對應就要使用
- 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.andExpect:新增執行完成後的斷言。新增ResultMatcher驗證規則,驗證控制器執行完成後結果是否正確;
- ResultActions.andDo:新增一個結果處理器,比如此處使用.andDo(MockMvcResultHandlers.print())輸出整個響應結果資訊,可以在除錯的時候使用。(備註)
- ResultActions.andReturn:表示執行完成後返回相應的結果
- text/html : HTML格式
- text/plain :純文字格式
- text/xml : XML格式 /
- image/gif :gif圖片格式
- image/jpeg :jpg圖片格式
- image/png:png圖片格式
- 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 : 需要在表單中進行檔案上傳時,就需要使用該格式
- MockHttpServletRequest getRequest():得到執行的請求;
- MockHttpServletResponse getResponse():得到執行後的響應;
- Object getHandler():得到執行的處理器,一般就是控制器;
- HandlerInterceptor[] getInterceptors():得到對處理器進行攔截的攔截器;
- ModelAndView getModelAndView():得到執行後的ModelAndView;
- Exception getResolvedException():得到HandlerExceptionResolver解析後的異常;
- FlashMap getFlashMap():得到FlashMap;
- Object getAsyncResult()/Object getAsyncResult(long timeout):得到非同步執行的結果;