51Testing软件测试论坛
标题:
mockito中实现部分mock两种方式:spy与callRealMethod()
[打印本页]
作者:
胖虎
时间:
2019-3-22 15:32
标题:
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());
}
复制代码
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2