「一、前言」
在前面的章節我們介紹過 Junit 的使用,也了解過 spring-test,今天我們來了解一個新玩意 -- mock 測驗,這里僅僅做一個入門,對回傳視圖和回傳 Json 資料的方法進行測驗演示,不會把所有的方法都介紹到,具體檔案詳見鏈接:Mock Test,本章節主要講解以下兩部分內容:
1、Mock 測驗簡介
2、測驗用例演示
二、Mock 測驗簡介
1、什么是 mock 測驗
在測驗程序中,對于某些不容易構造或者不容易獲取的物件,用一個「虛擬的物件」來創建以便測驗的測驗方法,就是 「mock 測驗」在測驗程序中,對于某些不容易構造或者不容易獲取的物件,用一個「虛擬的物件」來創建以便測驗的測驗方法,就是mock 測驗,
虛擬的物件就是 mock 物件,
mock 物件就是真實物件在除錯期間的代替品,
2、為什么使用 mock 測驗
避免開發模塊之間的耦合
輕量、簡單、靈活
3、MockMVC 介紹
基于 RESTful 風格的 SpringMVC 的測驗,我們可以測驗完整的 Spring MVC 流程,即從 URL 請求到控制器處理,再到視圖渲染都可以測驗,
1)MockMvcBuilder
MockMvcBuilder 是用來構造 MockMvc 的構造器,其主要有兩個實作:StandaloneMockMvcBuilder 和 DefaultMockMvcBuilder,對于我們來說直接使用「靜態工廠 MockMvcBuilders 創建」即可,
2)MockMvcBuilders
負責創建 MockMvcBuilder 物件,有兩種創建方式:
standaloneSetup(Object... controllers):通過引數指定一組控制器,這樣就不需要從背景關系獲取了,
「webAppContextSetup」(WebApplicationContext wac):指定 WebApplicationContext,將會從該背景關系獲取相應的控制器并得到相應的 MockMvc,本章節下面測驗用例均使用這種方式創建 MockMvcBuilder 物件,
3)MockMvc
對于服務器端的 SpringMVC 測驗支持主入口點,通過 MockMvcBuilder 構造 MockMvcBuilder 由 MockMvcBuilders 建造者的靜態方法去建造,
核心方法:perform(RequestBuilder rb) -- 執行一個 RequestBuilder 請求,會自動執行 SpringMVC 的流程并映射到相應的控制器執行處理,該方法的回傳值是一個 ResultActions,
4)ResultActions
(1)「andExpect」:添加 ResultMatcher 驗證規則,驗證控制器執行完成后結果是否正確;
(2)「andDo」:添加 ResultHandler 結果處理器,比如除錯時列印結果到控制臺;
(3)「andReturn」:最后回傳相應的 「MvcResult」;然后進行自定義驗證 / 進行下一步的異步處理;
5)MockMvcRequestBuilders
用來構建請求的,其主要有兩個子類 「MockHttpServletRequestBuilder 和」 MockMultipartHttpServletRequestBuilder(如檔案上傳使用),即用來 Mock 客戶端請求需要的所有資料,
6)MockMvcResultMatchers
(1)用來匹配執行完請求后的「結果驗證」
(2)如果匹配失敗將拋出相應的例外
(3)包含了很多驗證 API 方法
7)MockMvcResultHandlers
(1)結果處理器,表示要對結果做點什么事情
(2)比如此處使用 MockMvcResultHandlers.print() 輸出整個回應結果資訊
8)MvcResult
(1)單元測驗執行結果,可以針對執行結果進行「自定義驗證邏輯」,
三、測驗用例演示
1、添加依賴
<!-- spring 單元測驗組件包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<!-- 單元測驗Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- Mock測驗使用的json-path依賴 -->
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.2.0</version>
</dependency>
前兩個 jar 依賴我們都已經接觸過了,對于回傳視圖方法的測驗這兩個 jar 依賴已經足夠了,第三個 jar 依賴是用于處理回傳 Json 資料方法的,這里要明白每個 jar 的具體作用,
2、被測驗的方法
@RequestMapping(value = "https://www.cnblogs.com/rutaha/p/editItem")
public String editItem(Integer id, Model model) {
Item item = itemService.getItemById(id);
model.addAttribute("item", item);
return "itemEdit";
}
@RequestMapping(value = "https://www.cnblogs.com/rutaha/p/getItem")
@ResponseBody
public Item getItem(Integer id) {
Item item = itemService.getItemById(id);
return item;
}
這里我們提供了兩個方法,一個是回傳視圖的方法,另一個是回傳 Json 資料的方法,下面我們會給出測驗類,分別對這兩個方法進行測驗,
3、測驗類:ItemMockTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/*.xml")
@WebAppConfiguration
public class ItemMockTest {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void init() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
}
這里前兩個注解就不再解釋了,我們在學習 Spring 與 Junit 整合的時候已經講解過了,這里說一下第三個注解:@WebAppConfiguration:可以在單元測驗的時候,不用啟動 Servlet 容器,就可以獲取一個 Web 應用背景關系,
1)回傳視圖方法測驗
@Test
public void test() throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/editItem").param("id", "1"))
.andExpect(MockMvcResultMatchers.view().name("itemEdit"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
Assert.assertNotNull(result.getModelAndView().getModel().get("item"));
}

這三句代碼是我們對結果的期望,最后列印出了結果,說明執行成功,所有期望都達到了,否則會直接報錯,從結果中我們就可以看到這個請求測驗的情況,
2、回傳 Json 資料方法
@Test
public void test1() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/getItem")
.param("id", "1")
.accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.jsonPath("$.id").value(1))
.andExpect(MockMvcResultMatchers.jsonPath("$.name").value("IPhone X"))
.andDo(MockMvcResultHandlers.print())
.andReturn();
}

在這個方法中比較特殊的就是設定 MediaType 型別,因為都是使用 Json 格式,所以設定了 MediaType.APPLICATION_JSON,jsonPath 用于比對期望的資料是否與回傳的結果一致,這里需要注意的是 "$.id" 這 key 的種形式,
四、小結
這里只是用到了 MockMvc 很小一部分知識,更加深入學習會使你養成一種良好撰寫單元測驗的習慣,這是十分難得的一種好習慣,推薦去看官方檔案,然后動手去測驗一下,為你撰寫的每一個 Controller 方法進行測驗,保證他們的可靠性,
作者:alanshelby
來源:zhuanlan.zhihu.com/p/43260823
總結了一些2020年的面試題,這份面試題的包含的模塊分為19個模塊,分別是: Java 基礎、容器、多執行緒、反射、物件拷貝、JavaWeb例外、網路、設計模式、Spring/Spring MVC、SpringBoot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM,獲取資料以上資料關注公眾號:有故事的程式員,獲取學習資料,
記得點個關注+評論哦~

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245509.html
標籤:Java
