mockito中两种部分mock的实现

5 篇文章 0 订阅
1 篇文章 0 订阅

什么是类的部分mock(partial mock)?

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

 

 

为什么需要部分mock?

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

 

 

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

spy实现

 

List<String> list = new LinkedList<String>();
List<String> spy = spy(list);
when(spy.size()).thenReturn(100);

spy.add("one");
spy.add("two");

assertEquals(spy.get(0), "one");
assertEquals(100, spy.size());

 

 

spy的原理是,如果不打桩默认都会执行真实的方法,如果打桩则返回桩实现。

可以看出spy.size()通过桩实现返回了值100,而spy.get(0)则返回了实际值。

严重注意:使用spy的桩实现实际还是会调用stub的方法,只是返回了stub的值,验证代码如下:

 

 

	@Test
	public void spyTest() {
		Jack spyJack = spy(new Jack());
		when(spyJack.go()).thenReturn(false);

		assertFalse(spyJack.go());
	}

	class Jack {
		public boolean go() {
			System.out.println("I say go go go!!");
			return true;
		}
	}

 

go方法的返回值的确返回的桩实现,但是通过console看到go()方法的确输出了文字。

★ 批注:又捣鼓了一下,发下使用语句“doReturn(1111).when(spyJack).go();” 是好使的,这是一个陷阱,使用的时候要注意。

 

callRealMethod()实现

 

	@Test
	public void callRealMethodTest() {
		Jerry jerry = mock(Jerry.class);

		doCallRealMethod().when(jerry).goHome();
		doCallRealMethod().when(jerry).doSomeThingB();

		jerry.goHome();

		verify(jerry).doSomeThingA();
		verify(jerry).doSomeThingB();
	}

	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.");

		}
	}
 

    通过代码可以看出Jerry是一个mock对象, goHome()和doSomeThingB()是使用了实际调用技术,而doSomeThingA()被mockito执行了默认的answer行为(这里是个void方法,so,什么也不干)。

 

总结:

    spy和callrealmethod都可以实现部分mock,唯一不同的是通过spy做的桩实现仍然会调用实际方法(我都怀疑这是不是作者的bug)。

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

 

    mock技术是实施TDD过程必备的装备,熟练掌握mockito(或者其他工具)可以更有效的进行测试。虽然mockito作者也觉得部分测试不是好的设计,但是在java这样一个不是完全面向对象技术的平台上,我们其实没必要过分纠结这些细节,简洁,可靠的代码才是我们需要的。

 

 

参考资料:

http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#1

 

--heipark

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值