一 簡介
MockMvc實現對Http請求的模擬,可以方便對Controller進行測試,使得測試速度快、不依賴網絡環境,而且提供驗證的工具,使得請求的驗證統一而且很方便。
二 常見使用方式
1 MockMvcBuilder構造MockMvc的構造器
2 MockMvcRequestBuilders創建請求request
3 mockMvc調用perform,執行一個request請求,調用controller的業務處理邏輯,返回ResultActions
4 可以通過ResultActions, MockMvcResultMatchers對結果進行驗證
示例:
@RunWith(SpringRunner.class) @SpringBootTest @TestExecutionListeners({ MockitoTestExecutionListener.class}) // 使用@MockBean, @SpyBean public abstract class AbstractBaseTest extends AbstractJUnit4SpringContextTests { protected static final Logger LOG = LogUtils.get(); } public class MockMvcDemo extends AbstractBaseTest { private MockMvc mvc; @Before public void setUp() { mvc = MockMvcBuilders.standaloneSetup(new AccountController()).build(); } @Test public void test() throws Exception { // 構建請求 MockHttpServletRequestBuilder request = MockMvcRequestBuilders.get("/account/info") .contentType("text/html") .accept(MediaType.APPLICATION_JSON); // 發送請求,獲取請求結果 ResultActions perform = mvc.perform(request); // 請求結果校驗 perform.andExpect(MockMvcResultMatchers.status().isOk()); MvcResult mvcResult = perform.andReturn(); MockHttpServletResponse response = mvcResult.getResponse(); // 校驗類:org.springframework.test.web.servlet.result.MockMvcResultMatchers } }
1 MockMvcBuilder
MockMvcBuilder是MockMvc的構造器,主要有兩個實現:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
① MockMvcBuilders.webAppContextSetup(WebApplicationContext context):集成Web環境方式,指定WebApplicationContext,將會從該上下文獲取相應的控制器並得到相應的MockMvc;
② MockMvcBuilders.standaloneSetup(Object... controllers):獨立測試方式,通過參數指定一組控制器,這樣就不需要從上下文獲取了,比如this.mockMvc =MockMvcBuilders.standaloneSetup(new AccountController()).build();
2 MockMvcRequestBuilders
MockMvcRequestBuilders用於構建請求,返回MockHttpServletRequestBuilder / MockMultipartHttpServletRequestBuilder ,
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常用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):指定要上傳的文件;
示例:
MockHttpServletRequestBuilder request = MockMvcRequestBuilders.get("/account/info")
.contentType("text/html")
.accept(MediaType.APPLICATION_JSON);
3 ResultActions
MockMvc.perform(RequestBuilder requestBuilder)調用后返回ResultActions:
ResultActions.andExpect:添加執行完成后的斷言。添加ResultMatcher驗證規則,驗證控制器執行完成后結果是否正確;
ResultActions.andDo:添加一個結果處理器,比如此處使用.andDo(MockMvcResultHandlers.print())輸出整個響應結果信息,可以在調試的時候使用;
ResultActions.andReturn:表示執行完成后返回相應的結果,用於自定義驗證/下一步的異步處理;
4 ResultMatchers
ResultMatcher驗證匹配執行完請求后的結果,只有一個match(MvcResult result)斷言方法,如果匹配失敗將拋出相應的異常。
spring mvc測試框架提供了很多***ResultMatchers來滿足測試需求,可以通過MockMvcResultMatchers查看內置ResultMatcher。(注意:***ResultMatchers不是ResultMatcher的實現子類)
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);
5 MvcResult
MvcResult為執行完控制器后得到的整個結果,並不僅僅是返回值,其包含了測試時需要的所有信息。
MockHttpServletRequest getRequest():得到執行的請求;
MockHttpServletResponse getResponse():得到執行后的響應;
Object getHandler():得到執行的處理器,一般就是控制器;
HandlerInterceptor[] getInterceptors():得到對處理器進行攔截的攔截器;
ModelAndView getModelAndView():得到執行后的ModelAndView;
Exception getResolvedException():得到HandlerExceptionResolver解析后的異常;
FlashMap getFlashMap():得到FlashMap;
Object getAsyncResult()/Object getAsyncResult(long timeout):得到異步執行的結果;
四 相關鏈接