web應用本來需要依靠tomcat這個環境運行
現在用mockMvc是為了模擬這個web環境,簡化測試
什么是mock(模擬)
模擬對象---mock object是以可控方式模擬真實對象行為的假對象,通過模擬輸入數據,驗證程序達到預期結果
為什么使用mock對象
因為真實對象過于復雜,無法在單元測試中使用,故采用模擬對象替代
如網絡延遲,不可能在單元測試中直接搭建一個服務器,只需要mock模擬出場景就行
mockMvc
spring-test包提供,能夠實現對于http請求的模擬,直接使用網絡的形式,轉換到Controller的調用,使得測試速度快,不依賴網絡環境,同時提供了一套的驗證工具
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
mockMvc對象能夠和Junit5來mock模擬出來tomcat運行環境,幫助自動測試出來接口
例子1:日志輸出測試
類中方法:
@RequestMapping(value = "/logger",method = RequestMethod.GET)@ResponseBodypublic String testLogger() {Logger logger = LoggerFactory.getLogger(this.getClass());logger.debug("測試級別日志");return "SUCCESS";}
測試代碼:
@Resourceprivate MockMvc mockMvc;@Test@DisplayName("加油站-自己重定義測試方法名")public void testMock1() throws Exception {//自動向/logger發起一個get請求->mockMvc.perform(MockMvcRequestBuilders.get("/logger")).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andExpect(MockMvcResultMatchers.content().string("SUCCESS")).andReturn();}
啟動test,下面控制臺顯示的和實際上啟動web應用是一致的,這個就是mock的模擬過程
實現:
端口號是隨機的 ,原因是在注解@SpringBootTest上設置了
webEnvironment =SpringBootTest.WebEnvironment.RANDOM_PORT(每次都是隨機端口,防止端口占用)
控制臺顯示了請求和響應的詳細信息,就像在瀏覽器的檢查網絡頁面顯示的一樣
請求信息:
輔助描述信息:
響應:
若在測試類中新增一句預期為SUCCESS1,如下圖與實際結果不符,測試就會爆紅,并說明預期值和實際值各為多少
@DispayName注解可用于重新定義方法名
例子2:JSON響應測試用例
類中方法:
@RequestMapping(value = "/get_header",method = RequestMethod.GET)@ResponseBodypublic Map getHeader(@RequestHeader("token") String accessToken,String id){Map<String,Object> params=new HashMap<>();//返回的是Map映射對象,里面是json格式的params.put("access_token",accessToken);params.put("id",id);return params;}
測試代碼:
@Test@DisplayName("json響應測試用例")public void testMock2() throws Exception {//請求頭設置,還有請求參數的設置mockMvc.perform(MockMvcRequestBuilders.get("/get_header")//設置請求頭中access_token的信息.header("token","assssdq")//設置傳入的參數id的值.param("id","891113"))//是否符合預期的響應isOK.andExpect(MockMvcResultMatchers.status().isOk())//響應的請求頭的值是否和設置的請求頭內的數據相等.andExpect(MockMvcResultMatchers.jsonPath("access_token").value("assssdq"))//將完整的響應過程,從請求到響應的各個參數的值都返回輸出在控制臺上.andDo(MockMvcResultHandlers.print())//結束請求并獲得處理結果.andReturn();}
?測試結果:
?