Mock我的總結

前言

最近在進行單元測試的時候使用到了mock方法,同時經過老師的講解也大體理解了單元測試的過程,下面對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的框架

咱們瞭解完Mock後,那什麼是Mockito,什麼是MockMvc呢,他們都是Mock的框架,其中,Mockito是Mock應用最普遍的框架。mvc

MockMvc

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

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方法不只使測試時更加快速準確,也知足了先後端分離測試的需求,讓咱們的測試更加簡單。這是這一週與同伴們和老師共同窗習的結果和總結,感謝個人同伴們和老師。

相關文章
相關標籤/搜索