springMVC單元測試【二】--MockMvc/MockMvcBuilder/MockMvcBuilders


MockMvcBuilder是用來構造MockMvc的構造器,其主要有兩個實現:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分別對應之前的兩種測試方式。對於我們來說直接使用靜態工廠MockMvcBuilders創建即可:

MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,將會從該上下文獲取相應的控制器並得到相應的MockMvc;

MockMvcBuilders.standaloneSetup(Object... controllers):通過參數指定一組控制器,這樣就不需要從上下文獲取了;

 

其中DefaultMockMvcBuilder還提供了如下API:

addFilters(Filter... filters)/addFilter(Filter filter, String... urlPatterns):添加javax.servlet.Filter過濾器

defaultRequest(RequestBuilder requestBuilder):默認的RequestBuilder,每次執行時會合並到自定義的RequestBuilder中,即提供公共請求數據的;

alwaysExpect(ResultMatcher resultMatcher):定義全局的結果驗證器,即每次執行請求時都進行驗證的規則;

alwaysDo(ResultHandler resultHandler):定義全局結果處理器,即每次請求時都進行結果處理;

dispatchOptions:DispatcherServlet是否分發OPTIONS請求方法到控制器;

 

StandaloneMockMvcBuilder繼承了DefaultMockMvcBuilder,又提供了如下API:

setMessageConverters(HttpMessageConverter...messageConverters):設置HTTP消息轉換器;

setValidator(Validator validator):設置驗證器;

setConversionService(FormattingConversionService conversionService):設置轉換服務;

addInterceptors(HandlerInterceptor... interceptors)/addMappedInterceptors(String[] pathPatterns, HandlerInterceptor... interceptors):添加spring mvc攔截器;

setContentNegotiationManager(ContentNegotiationManager contentNegotiationManager):設置內容協商管理器;

setAsyncRequestTimeout(long timeout):設置異步超時時間;

setCustomArgumentResolvers(HandlerMethodArgumentResolver... argumentResolvers):設置自定義控制器方法參數解析器;

setCustomReturnValueHandlers(HandlerMethodReturnValueHandler... handlers):設置自定義控制器方法返回值處理器;

setHandlerExceptionResolvers(ListexceptionResolvers)/setHandlerExceptionResolvers(HandlerExceptionResolver... exceptionResolvers):設置異常解析器;

setViewResolvers(ViewResolver...resolvers):設置視圖解析器;

setSingleView(View view):設置單個視圖,即視圖解析時總是解析到這一個(僅適用於只有一個視圖的情況);

setLocaleResolver(LocaleResolver localeResolver):設置Local解析器;

setFlashMapManager(FlashMapManager flashMapManager):設置FlashMapManager,如存儲重定向數據;

setUseSuffixPatternMatch(boolean useSuffixPatternMatch):設置是否是后綴模式匹配,如“/user”是否匹配/user.*,默認真即匹配;

setUseTrailingSlashPatternMatch(boolean useTrailingSlashPatternMatch):設置是否自動后綴路徑模式匹配,如“/user”是否匹配“/user/”,默認真即匹配;

addPlaceHolderValue(String name, String value) :添加request mapping中的占位符替代;

 

因為StandaloneMockMvcBuilder不會加載Spring MVC配置文件,因此就不會注冊我們需要的一些組件,因此就提供了如上API用於注冊我們需要的相應組件。

 

-------------------------------------------------------------------------------------------------------------------------老實說這是我複製的。

MockMvc

  該對象可以由方法webAppContextSetup(WebApplicationContext context).build()構造,

     

//get方法來之MockMvcRequestBuilders
        MvcResult rs = mockMvc.perform(post("/memberController/to/?page=index"))
                .andExpect(MockMvcResultMatchers.view().name("index"))
                .andExpect(MockMvcResultMatchers.model().attributeExists("page"))
                .andDo(MockMvcResultHandlers.print()).andExpect(status().isOk())
                .andReturn();

 

perform:執行一個RequestBuilder請求,會自動執行SpringMVC的流程並映射到相應的控制器執行處理;

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

andDo:添加ResultHandler結果處理器,比如調試時打印結果到控制台;

andReturn:最后返回相應的MvcResult;然后進行自定義驗證/進行下一步的異步處理;

 

另外還提供了以下API:

setDefaultRequest:設置默認的RequestBuilder,用於在每次perform執行相應的RequestBuilder時自動把該默認的RequestBuilder合並到perform的RequestBuilder中;

setGlobalResultMatchers:設置全局的預期結果驗證規則,如我們通過MockMvc測試多個控制器時,假設它們都想驗證某個規則時,就可以使用這個;

setGlobalResultHandlers:設置全局的ResultHandler結果處理器;

 

RequestBuilder/MockMvcRequestBuilders

從名字可以看出,RequestBuilder用來構建請求的,其提供了一個方法buildRequest(ServletContext servletContext)用於構建MockHttpServletRequest;其主要有兩個子類MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如文件上傳使用),即用來Mock客戶端請求需要的所有數據。

 

MockMvcRequestBuilders主要API:

MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根據uri模板和uri變量值得到一個GET請求方式的MockHttpServletRequestBuilder;如get(/user/{id}, 1L);

MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables):同get類似,但是是POST方法;

MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables):同get類似,但是是PUT方法;

MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) :同get類似,但是是DELETE方法;

MockHttpServletRequestBuilder options(String urlTemplate, Object... urlVariables):同get類似,但是是OPTIONS方法;

MockHttpServletRequestBuilder request(HttpMethod httpMethod, String urlTemplate, Object... urlVariables):提供自己的Http請求方法及uri模板和uri變量,如上API都是委托給這個API;

MockMultipartHttpServletRequestBuilder fileUpload(String urlTemplate, Object... urlVariables):提供文件上傳方式的請求,得到MockMultipartHttpServletRequestBuilder;

RequestBuilder asyncDispatch(final MvcResult mvcResult):創建一個從啟動異步處理的請求的MvcResult進行異步分派的RequestBuilder;

 

接下來再看看MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder API:

MockHttpServletRequestBuilder API:

MockHttpServletRequestBuilder header(String name, Object... values)/MockHttpServletRequestBuilder headers(HttpHeaders httpHeaders):添加頭信息;

MockHttpServletRequestBuilder contentType(MediaType mediaType):指定請求的contentType頭信息;

MockHttpServletRequestBuilder accept(MediaType... mediaTypes)/MockHttpServletRequestBuilder accept(String... mediaTypes):指定請求的Accept頭信息;

MockHttpServletRequestBuilder content(byte[] content)/MockHttpServletRequestBuilder content(String content):指定請求Body體內容;

MockHttpServletRequestBuilder cookie(Cookie... cookies):指定請求的Cookie;

MockHttpServletRequestBuilder locale(Locale locale):指定請求的Locale;

MockHttpServletRequestBuilder characterEncoding(String encoding):指定請求字符編碼;

MockHttpServletRequestBuilder requestAttr(String name, Object value) :設置請求屬性數據;

MockHttpServletRequestBuilder sessionAttr(String name, Object value)/MockHttpServletRequestBuilder sessionAttrs(Map<string, object=""> sessionAttributes):設置請求session屬性數據;

MockHttpServletRequestBuilder flashAttr(String name, Object value)/MockHttpServletRequestBuilder flashAttrs(Map<string, object=""> flashAttributes):指定請求的flash信息,比如重定向后的屬性信息;

MockHttpServletRequestBuilder session(MockHttpSession session) :指定請求的Session;

MockHttpServletRequestBuilder principal(Principal principal) :指定請求的Principal;

MockHttpServletRequestBuilder contextPath(String contextPath) :指定請求的上下文路徑,必須以“/”開頭,且不能以“/”結尾;

MockHttpServletRequestBuilder pathInfo(String pathInfo) :請求的路徑信息,必須以“/”開頭;

MockHttpServletRequestBuilder secure(boolean secure):請求是否使用安全通道;

MockHttpServletRequestBuilder with(RequestPostProcessor postProcessor):請求的后處理器,用於自定義一些請求處理的擴展點;

 

MockMultipartHttpServletRequestBuilder繼承自MockHttpServletRequestBuilder,又提供了如下API:

MockMultipartHttpServletRequestBuilder file(String name, byte[] content)/MockMultipartHttpServletRequestBuilder file(MockMultipartFile file):指定要上傳的文件;

 

ResultActions

調用MockMvc.perform(RequestBuilder requestBuilder)后將得到ResultActions,通過ResultActions完成如下三件事:

ResultActions andExpect(ResultMatcher matcher) :添加驗證斷言來判斷執行請求后的結果是否是預期的;

ResultActions andDo(ResultHandler handler) :添加結果處理器,用於對驗證成功后執行的動作,如輸出下請求/結果信息用於調試;

MvcResult andReturn() :返回驗證成功后的MvcResult;用於自定義驗證/下一步的異步處理;

 

ResultMatcher/MockMvcResultMatchers

ResultMatcher用來匹配執行完請求后的結果驗證,其就一個match(MvcResult result)斷言方法,如果匹配失敗將拋出相應的異常;spring mvc測試框架提供了很多***ResultMatchers來滿足測試需求。注意這些***ResultMatchers並不是ResultMatcher的子類,而是返回ResultMatcher實例的。Spring mvc測試框架為了測試方便提供了MockMvcResultMatchers靜態工廠方法方便操作;具體的API如下:

HandlerResultMatchers handler():請求的Handler驗證器,比如驗證處理器類型/方法名;此處的Handler其實就是處理請求的控制器;

RequestResultMatchers request():得到RequestResultMatchers驗證器;

ModelResultMatchers model():得到模型驗證器;

ViewResultMatchers view():得到視圖驗證器;

FlashAttributeResultMatchers flash():得到Flash屬性驗證;

StatusResultMatchers status():得到響應狀態驗證器;

HeaderResultMatchers header():得到響應Header驗證器;

CookieResultMatchers cookie():得到響應Cookie驗證器;

ContentResultMatchers content():得到響應內容驗證器;

JsonPathResultMatchers jsonPath(String expression, Object ... args)/ResultMatcher jsonPath(String expression, Matcher matcher):得到Json表達式驗證器;

XpathResultMatchers xpath(String expression, Object... args)/XpathResultMatchers xpath(String expression, Map<string, string=""> namespaces, Object... args):得到Xpath表達式驗證器;

ResultMatcher forwardedUrl(final String expectedUrl):驗證處理完請求后轉發的url(絕對匹配);

ResultMatcher forwardedUrlPattern(final String urlPattern):驗證處理完請求后轉發的url(Ant風格模式匹配,@since spring4);

ResultMatcher redirectedUrl(final String expectedUrl):驗證處理完請求后重定向的url(絕對匹配);

ResultMatcher redirectedUrlPattern(final String expectedUrl):驗證處理完請求后重定向的url(Ant風格模式匹配,@since spring4);

 

得到相應的***ResultMatchers后,接着再調用其相應的API得到ResultMatcher,如ModelResultMatchers.attributeExists(final String... names)判斷Model屬性是否存在。具體請查看相應的API。再次就不一一列舉了。

 

 

ResultHandler/MockMvcResultHandlers

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

 

 

MvcResult

即執行完控制器后得到的整個結果,並不僅僅是返回值,其包含了測試時需要的所有信息,如:

MockHttpServletRequest getRequest():得到執行的請求;

MockHttpServletResponse getResponse():得到執行后的響應;

Object getHandler():得到執行的處理器,一般就是控制器;

HandlerInterceptor[] getInterceptors():得到對處理器進行攔截的攔截器;

ModelAndView getModelAndView():得到執行后的ModelAndView;

Exception getResolvedException():得到HandlerExceptionResolver解析后的異常;

FlashMap getFlashMap():得到FlashMap;

Object getAsyncResult()/Object getAsyncResult(long timeout):得到異步執行的結果;

 

 

-----------看這麼多文字是不是很煩!!!!!!!!!!!我也是!!!!!!!!!!!!!


免責聲明!

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



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