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

原创 2015年11月20日 15:08:40

什么是类的部分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());  
	}



mockito-关于@Mock和@Spy的使用方法

参考:http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html 当我们对@Mock的类(@Mock private ...
  • hotdust
  • hotdust
  • 2016年05月15日 14:22
  • 6446

强大的Mockito测试框架

1自动生成Mock类 在需要Mock的属性上标记@Mock注解,然后@RunWith(MockitoJUnitRunner.class)或者在setUp()方法中显示调用MockitoAnn...
  • dc_726
  • dc_726
  • 2013年02月04日 12:42
  • 32190

Mockito单元测试-注解的详细使用

 1,@Mock @Target(FIELD)@Retention(RUNTIME)@Documentedpublic @interface Mock {    Answers an...
  • fuli_mouren
  • fuli_mouren
  • 2016年04月06日 13:45
  • 3318

JUnit + Mockito 单元测试(二)

JUnit 是单元测试框架。Mockito 与 JUnit 不同,并不是单元测试框架(这方面 JUnit 已经足够好了),它是用于生成模拟对象或者直接点说,就是”假对象“的工具。两者定位不同,所以一般...
  • zhangxin09
  • zhangxin09
  • 2015年01月05日 17:26
  • 48756

mockito-关于@Mock和@Spy的使用方法

mockito-关于@Mock和@Spy的使用方法 2016-05-15 14:22 1091人阅读 评论(0) 收藏 举报  分类: 测试(7)  参考:ht...
  • jiafu1115
  • jiafu1115
  • 2016年12月27日 11:28
  • 1586

Mockito使用

最近用Mockito写了好多测试,之所以选中Mockito,而不是EasyMock,或者JMock,是因为我看了官方的对比文档:Mockito对比EasyMock,从文档中就可以看出来,Mockito...
  • dc_726
  • dc_726
  • 2013年03月24日 16:55
  • 8618

Mockito浅谈

Mockito浅谈Mockito浅谈 Mockito简介 Mock的好处是什么 Mockito使用示例 模拟对象 模拟方法调用的返回值 模拟方法调用抛出异常 模拟调用方法时的参数匹配 模拟方法调用次数...
  • xia215266092
  • xia215266092
  • 2016年07月18日 21:43
  • 4234

@Mock, @Spy, @Captor and @InjectMocks

http://www.baeldung.com/mockito-annotations 1. Overview In this tutorial, we’ll cover all the a...
  • u013428664
  • u013428664
  • 2015年03月06日 10:26
  • 1374

测试驱动开发中的Dummy, Stub, Spy, Mock, Fake

测试哑元(Dummy) - 只是帮助测试项目编译通过,不在具体测试里面起任何作用。 测试桩(Stub) - 只是能返回帮助测试的值 测试间谍(Spy) - 目的是测试被测单元传过来的值,也能返回值。T...
  • IBelieve1974
  • IBelieve1974
  • 2017年02月15日 11:24
  • 834

单元测试利器-Mockito 中文文档

Mockito库能够Mock对象、验证结果以及打桩(stubbing),是单元测试中mock对象非常重要的开源库...
  • bboyfeiyu
  • bboyfeiyu
  • 2016年08月05日 11:36
  • 14656
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mockito中实现部分mock两种方式:spy与callRealMethod()
举报原因:
原因补充:

(最多只允许输入30个字)