單元測試Mockito中的Mock和Spy

轉載:https://blog.csdn.net/qq_30141957/article/details/81273829函數

項目中,有些函數須要處理某個服務的返回結果,而在對函數單元測試的時候,又不能啓動那些服務,這裏就能夠利用Mockito工具。Mockito中的Mock和Spy均可用於攔截那些還沒有實現或不指望被真實調用的對象和方法,併爲其設置自定義行爲。兩者的區別在於:工具

一、Mock聲明的對象,對函數的調用均執行mock(即虛假函數),不執行真正部分。單元測試

二、Spy聲明的對象,對函數的調用均執行真正部分。測試

例:this

  1.  
    public class Main {
  2.  
     
  3.  
    public void fun(String s) {
  4.  
    System. out.println(s + " : fun");
  5.  
    fun1(s);
  6.  
    fun2(s);
  7.  
    }
  8.  
     
  9.  
    public void fun1(String s) {
  10.  
    System. out.println(s + " : fun1");
  11.  
    }
  12.  
     
  13.  
    private void fun2(String s) {
  14.  
    System. out.println(s + " : fun2");
  15.  
    }
  16.  
     
  17.  
    public int getVal(){
  18.  
    return 5;
  19.  
    }
  20.  
    }

Mock使用實例

一、使用doCallRealMethod().when()調用函數真正部分。spa

二、使用when().thenReturn自定義函數返回值。.net

  1.  
    import static org.mockito.ArgumentMatchers.anyString;
  2.  
    import static org.mockito.Mockito.doCallRealMethod;
  3.  
    import static org.mockito.Mockito.when;
  4.  
     
  5.  
    import org.junit.Before;
  6.  
    import org.junit.Test;
  7.  
    import org.mockito.Mock;
  8.  
    import org.mockito.MockitoAnnotations;
  9.  
     
  10.  
    public class MainTest {
  11.  
     
  12.  
    @Mock
  13.  
    Main mockMain;
  14.  
     
  15.  
    @Before
  16.  
    public void init() {
  17.  
    MockitoAnnotations.initMocks( this);
  18.  
    }
  19.  
     
  20.  
    @Test
  21.  
    public void testFun() {
  22.  
    // 執行mock,而不是真正部分,因此沒有打印任何信息
  23.  
    mockMain. fun("mock test One");
  24.  
     
  25.  
    // doCallRealMethod聲明後,執行真正部分
  26.  
    // 可是Mock只能對public(fun1)和protected函數進行mock
  27.  
    // 對private函數(fun2)仍執行真正部分
  28.  
    // 因此輸出fun和fun2
  29.  
    doCallRealMethod(). when(mockMain).fun(anyString());
  30.  
    mockMain. fun("mock test Two");
  31.  
     
  32.  
    // 執行mock,輸出int的默認值0,而不是5
  33.  
    System. out.println("val: " + mockMain.getVal());
  34.  
    // when聲明後,既不走真正部分,也不走mock,直接返回thenReturn()中定義的值
  35.  
    // 注意:該值的類型須要和when中函數返回值類型一致
  36.  
    when(mockMain.getVal()).thenReturn(10);
  37.  
    System. out.println("val: " + mockMain.getVal());
  38.  
    }
  39.  
     
  40.  
    }

Spy使用實例

一、使用when().thenReturn自定義函數返回值。3d

  1.  
    import static org.mockito.Mockito.when;
  2.  
     
  3.  
    import org.junit.Before;
  4.  
    import org.junit.Test;
  5.  
    import org.mockito.MockitoAnnotations;
  6.  
    import org.mockito.Spy;
  7.  
     
  8.  
    public class MainTest {
  9.  
     
  10.  
    @Spy
  11.  
    Main spyMain;
  12.  
     
  13.  
    @Before
  14.  
    public void init() {
  15.  
    MockitoAnnotations.initMocks( this);
  16.  
    }
  17.  
     
  18.  
    @Test
  19.  
    public void testFun() {
  20.  
    // 執行真正部分
  21.  
    spyMain. fun("mock test One");
  22.  
     
  23.  
    // 執行真正部分
  24.  
    System. out.println("val: " + spyMain.getVal());
  25.  
    // 自定義返回值
  26.  
    when(spyMain.getVal()).thenReturn(10);
  27.  
    System. out.println("val: " + spyMain.getVal());
  28.  
    }
  29.  
    }


參考文章:code

一、mockito中實現部分mock兩種方式對象

二、@mock和@spy在mock私有方法的區別,使用@spy模擬私有方法進行測試時sonar統計是有覆蓋率的

三、Mockito的參數匹配

相關文章
相關標籤/搜索