关闭

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

标签: javamock
2444人阅读 评论(0) 收藏 举报
分类:

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



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:52667次
    • 积分:677
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:64篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论