TA的每日心情 | 擦汗 2022-8-30 09:02 |
---|
签到天数: 2 天 连续签到: 2 天 [LV.1]测试小兵
|
什么是类的部分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());
- }
复制代码
|
|