mockito中實現部分mock兩種方式:spy與callRealMethod()

什麼是類的部分mock(partial mock)?

A:部分mock是說一個類的方法有些是實際調用,有些是使用mockito的stubbing(樁實現)。

 

 

爲什麼需要部分mock?

A:當需要測試一個組合方法(一個方法需要其它多個方法協作)的時候,某個葉子方法(只供別人調用,自己不依賴其它反覆)已經被測試過,我們其實不需要再次測試這個葉子方法,so,讓葉子打樁實現返回結果,上層方法實際調用並測試。

 

mockito實現部分mock的兩種方式:spy和callRealMethod()

 spy和callrealmethod都可以實現部分mock,唯一不同的是通過spy做的樁實現仍然會調用實際方法,但返回的是你mock要求的返回。

   ★ 批註:spy方法需要使用doReturn方法纔不會調用實際方法。


<span style="color:#333333;">class Jerry {
    public void goHome() {
        doSomeThingA();
        doSomeThingB();
    }
    // real invoke it.
    public void doSomeThingB() {
        System.out.println("good day");
    }
    // auto mock method by mockito
    public void doSomeThingA() {
        System.out.println("you should not see this message.");
        doSomeThingB();
    }
    public boolean go() {  
        System.out.println("I say go go go!!");  
        return true;  
    } </span>
測試用例:

//  當需要整體Mock,只有少部分方法執行真正部分時,選用這種方式
    @Test  
    public void callRealMethodTest() { 
      
        Jerry jerry = Mockito.mock(Jerry.class);
        
        
        Mockito.doCallRealMethod().when(jerry).goHome();  
        Mockito.doCallRealMethod().when(jerry).doSomeThingB();  
      
        jerry.goHome();  
      
        Mockito.verify(jerry,Mockito.times(1)).doSomeThingA();  
        Mockito.verify(jerry,Mockito.times(1)).doSomeThingB();  
    }  
    // 當需要整體執行真正部分,只有少部分方法執行mock,選用這種方式
    @Test  
    public void spyTest() {  
        Jerry spyJack = Mockito.spy(new Jerry()); 
        // 用thenReturn 會走go()方法體,然後將返回值Mock掉
        Mockito.when(spyJack.go()).thenReturn(false);    
        Assert.assertFalse(spyJack.go());  
       // 用doReturn 不走go()方法體
        Mockito.doReturn(false).when(spyJack).go();    
        Assert.assertFalse(spyJack.go());  
    }

————————————————
版權聲明:本文爲CSDN博主「卜算」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/aeroleo/article/details/49946999

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章