Mockito簡介
在面向對象程序設計中,模擬對象(mock object)是以可控的方式模擬真實對象行爲的假的對象。比如:對象B依賴於對象A,但是A代碼還沒寫,是一個空類,空方法不能用,我們來mock一個假的A來完成測試。
在單元測試中,模擬對象可以模擬複雜的、真實的對象的行爲, 如果真實的對象無法放入單元測試中,使用模擬對象就很有幫助。
在下面的情形中,可能需要使用模擬對象來代替真實對象:
- 真實對象的行爲是不確定的(例如,當前的時間或當前的溫度);
- 真實對象很難搭建起來;
- 真實對象的行爲很難觸發(例如,網絡錯誤);
- 真實對象速度很慢(例如,一個完整的數據庫,在測試之前可能需要初始化);
- 真實的對象是用戶界面,或包括用戶界面在內;
- 真實的對象使用了回調機制;
- 真實對象可能還不存在(例如,其他程序員還爲完成工作);
- 真實對象可能包含不能用作測試的信息(高度保密信息等)和方法。
MockMvc實現了對Http請求的模擬,能夠直接使用網絡的形式,轉換到Controller的調用,這樣可以使得測試速度快、不依賴網絡環境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統一而且很方便。
因爲在做系統的自動化持續集成的時候,會要求自動的做單元測試,只有所有的單元測試都跑通了,才能打包構建。比如:使用maven。這裏重點是自動化,所以postman這種工具很難插入到持續集成的自動化流程中去。所以需要我們自己寫代碼完成單元測試。另外寫代碼測試能模擬出更多複雜的測試場景,類似Postman工具只能完成簡單的接口測試。
原理:使用MockMvc發起請求,然後執行相應的代碼,在執行的過程中使用Mockito的mock模擬底層數據的返回,最後結果驗證。
相關API
MockMvcBuilders
MockMvcBuilders用來構造MockMvc的構造器,其主要有兩個實現:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分別對應兩種測試方式,即獨立安裝和集成Web環境測試(此種方式並不會集成真正的web環境,而是通過相應的Mock API進行模擬測試,無須啓動服務器)。對於我們來說直接使用靜態工廠MockMvcBuilders創建即可。
- public static DefaultMockMvcBuilder webAppContextSetup(WebApplicationContext context)
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
MockMvcRequestBuilders通過方法得到兩類Builder,一個是MockHttpServletRequestBuilder ,一個是MockMultipartHttpServletRequestBuilder (上傳文件)
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 param(String name,String… values)
請求傳入參數 - 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
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)斷言方法,如果匹配失敗將拋出相應的異常;具體提供以下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)