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方法才不会调用实际方法。

 

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;    

    }

测试用例:

 //  当需要整体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());    

}  

posted @ 2017-04-06 10:44  princessd8251  阅读(818)  评论(0)    收藏  举报