Mockito原理

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章