最近在進行單元測試的時候使用到了mock方法,同時經過老師的講解也大體理解了單元測試的過程,下面對mock進行一些總結。前端
mock中文翻譯爲虛假的,不真實的。
人如其名,mock是在測試過程當中,對於一些不容易構造/獲取的對象,建立一個mock對象來模擬對象的行爲。
什麼是複雜的對象後端
class A 依賴 class B class B 依賴 class C和class D class C 依賴 ... class D 依賴 ...
被測對象依賴的對象構造複雜。咱們想對class A進行單元測試,須要構造大量的class B、C、D等依賴對象,他們的構造過程複雜,這時咱們能夠利用mock去構造虛擬的class B、C、D對象用於class A的測試,由於咱們只是想測試class A的行爲是否符合預期,咱們並不須要測試依賴對象。
另外,若是須要引入的的模塊開發還沒有完成,咱們又須要在單元測試中使用,咱們也能夠用Mock方法來代替。網絡
咱們瞭解完Mock後,那什麼是Mockito,什麼是MockMvc呢,他們都是Mock的框架,其中,Mockito是Mock應用最普遍的框架。mvc
MockMvc實現對Http請求的模擬,能夠方便對Controller進行測試,使得測試速度快、不依賴網絡環境。咱們不用再依賴前端的代碼,從而實現了先後端分離,獨立測試。
常見使用方式
1 MockMvcBuilder構造MockMvc的構造器框架
2 MockMvcRequestBuilders建立請求request前後端分離
3 mockMvc調用perform,執行一個request請求,調用controller的業務處理邏輯,返回ResultActions函數
4 對結果進行驗證
咱們看教程中的代碼實際上是合在一塊兒去寫post
@Test public void save() throws Exception { String url = "/Student"; JSONObject studentJsonObject = new JSONObject(); JSONObject klassJsonObject = new JSONObject(); studentJsonObject.put("sno", "學號測試"); studentJsonObject.put("name", "姓名測試"); klassJsonObject.put("id", -1); studentJsonObject.put("klass", klassJsonObject); MvcResult mvcResult = this.mockMvc.perform( MockMvcRequestBuilders.post(url) .content(studentJsonObject.toString()) .contentType(MediaType.APPLICATION_JSON_UTF8) ).andExpect(MockMvcResultMatchers.status().is(201)) .andReturn(); }
咱們將其中的測試拆分出來看看單元測試
// 構建請求 MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post(url) .content(studentJsonObject.toString()) .contentType(MediaType.APPLICATION_JSON_UTF8); // 發送請求,獲取請求結果 ResultActions perform = mvc.perform(request); // 請求結果校驗 perform.andExpect(MockMvcResultMatchers.status().is(201)); MvcResult mvcResult = perform.andReturn();
Mockito能夠理解爲mock input to output。咱們只關心input與output,也就是輸入與輸出,中間的過程實現咱們並不關心,從而實現了對複雜對象的簡單化。
前端傳給c層咱們利用MockMvc模擬,那測試C層與M層的數據傳輸咱們能夠利用Mockito來模擬。
咱們經常使用方法以下學習
Mockito.when( studentService.save( Mockito.any(Student.class))) .thenReturn(returnStudent);
當調用studentService.save()方法時並傳入一個Student類型的參數,就去返回returnStudent。這個的returnStudent使咱們去設定的。
咱們的save方法定義就是傳入一個Student類型的參數,爲何後面還會設定Mockito.any(Student.class)
呢,這是由於函數可能重載,咱們規定傳入參數防止產生歧義,固然這裏咱們沒有進行重載。
Mock方法不只使測試時更加快速準確,也知足了先後端分離測試的需求,讓咱們的測試更加簡單。這是這一週與同伴們和老師共同窗習的結果和總結,感謝個人同伴們和老師。