1. 程式人生 > >springmvc mockmvc單元測試

springmvc mockmvc單元測試

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

MockHttpServletRequestBuilder.get(String urlTemplate, Object… urlVariables): GET方法;

post(String urlTemplate, Object… urlVariables): POST方法;

put(String urlTemplate, Object… urlVariables): PUT方法;

delete(String urlTemplate, Object… urlVariables) : DELETE方法;

options(String urlTemplate, Object… urlVariables): OPTIONS方法;

ResultActions
呼叫MockMvc.perform(RequestBuilder requestBuilder)後將得到ResultActions,對ResultActions有以下三種處理:

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

ResultActions.andDo:新增一個結果處理器,比如此處使用.andDo(MockMvcResultHandlers.print())輸出整個響應結果資訊,可以在除錯的時候使用。

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

ResultMatchers
ResultMatcher用來匹配執行完請求後的結果驗證,其就一個**match(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):得到非同步執行的結果;