51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

测试开发精英班,通向高级软件测试工程师【好消息】企业内训服务上线啦!项目为王,自动化测试提升加速器 !横扫BAT,Python全栈测试开发技能大全
【第123期】:入行2年多测试如何渡过职业迷茫期?参与调查问卷 缔造行业趋势 月薪15K+的测试开发必备技能? 【活动】为视频UP主打CALL,互动领福利!
查看: 4219|回复: 1

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

[复制链接]

该用户从未签到

发表于 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.         }
复制代码


回复

使用道具 举报

本版积分规则

关闭

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

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

GMT+8, 2021-12-2 20:44 , Processed in 0.053522 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2021 Comsenz Inc.

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