單元測試Mockito中的Mock和Spy


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

項目中,有些函數需要處理某個服務的返回結果,而在對函數單元測試的時候,又不能啟動那些服務,這里就可以利用Mockito工具。Mockito中的Mock和Spy都可用於攔截那些尚未實現或不期望被真實調用的對象和方法,並為其設置自定義行為。二者的區別在於:

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

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

例:

  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使用實例

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

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

  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使用實例

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

  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.  
    }


參考文章:

1、mockito中實現部分mock兩種方式

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

3、Mockito的參數匹配


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM