51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 6485|回复: 1
打印 上一主题 下一主题

[原创] mockito中实现部分mock两种方式:spy与callRealMethod()

[复制链接]
  • TA的每日心情
    擦汗
    2022-8-30 09:02
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2019-3-22 15:32:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    什么是类的部分mock(partial mock)?

    A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现)。


    为什么需要部分mock?

    A:当需要测试一个组合方法(一个方法需要其它多个方法协作)的时候,某个叶子方法(只供别人调用,自己不依赖其它反复)已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试。


    mockito实现部分mock的两种方式:spy和callRealMethod()


    spy和callrealmethod都可以实现部分mock,唯一不同的是通过spy做的桩实现仍然会调用实际方法,但返回的是你mock要求的返回。

       ★ 批注:spy方法需要使用doReturn方法才不会调用实际方法。

    1. <span style="color:#333333;">class Jerry {
    2.         public void goHome() {
    3.                 doSomeThingA();
    4.                 doSomeThingB();
    5.         }
    6.         // real invoke it.
    7.         public void doSomeThingB() {
    8.                 System.out.println("good day");
    9.         }
    10.         // auto mock method by mockito
    11.         public void doSomeThingA() {
    12.                 System.out.println("you should not see this message.");
    13.                 doSomeThingB();
    14.         }
    15.         public boolean go() {  
    16.         System.out.println("I say go go go!!");  
    17.         return true;  
    18.     } </span>
    复制代码
    测试用例:
    1. //  当需要整体Mock,只有少部分方法执行真正部分时,选用这种方式
    2.         @Test  
    3.         public void callRealMethodTest() {
    4.           
    5.                 Jerry jerry = Mockito.mock(Jerry.class);
    6.                
    7.                
    8.             Mockito.doCallRealMethod().when(jerry).goHome();  
    9.             Mockito.doCallRealMethod().when(jerry).doSomeThingB();  
    10.           
    11.             jerry.goHome();  
    12.           
    13.             Mockito.verify(jerry,Mockito.times(1)).doSomeThingA();  
    14.             Mockito.verify(jerry,Mockito.times(1)).doSomeThingB();  
    15.         }  
    16.         // 当需要整体执行真正部分,只有少部分方法执行mock,选用这种方式
    17.         @Test  
    18.         public void spyTest() {  
    19.             Jerry spyJack = Mockito.spy(new Jerry());
    20.             // 用thenReturn 会走go()方法体,然后将返回值Mock掉
    21.             Mockito.when(spyJack.go()).thenReturn(false);   
    22.             Assert.assertFalse(spyJack.go());  
    23.            // 用doReturn 不走go()方法体
    24.             Mockito.doReturn(false).when(spyJack).go();   
    25.             Assert.assertFalse(spyJack.go());  
    26.         }
    复制代码


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-6 05:16 , Processed in 0.064346 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表