什麼是類的部分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