Mock Object工具横向比较(下)

本文介绍了EasyMock和MockCreator两种测试工具。EasyMock是功能丰富、使用灵活的动态Mock工具,可检查方法调用次序等;MockCreator能为Class自动生成Mock Object实现,可通过命令行或Eclipse插件操作。二者编写测试方法模式相同,可按需选用。

EasyMock

EasyMock自己的话来说:EasyMock is a class library that provides an easy way to use Mock Objects for given interfacesEasyMock提供了功能丰富的Mock Object。可以检查方法调用的次序,可以设定某个特定方法调用次数的范围,甚至可以不检查对Mock Object方法调用的一致性。可以说,EasyMock的动态Mock工具中使用最灵活的一个。

下面,来看看它的测试方法:

 

1.      public void testSimpleAdditionUsingEasyMock() throws Exception {

2.       MockControl control1 = MockControl.createControl(HttpServletRequest.class);

3.       HttpServletRequest mockHttpServletRequest =

4.               (HttpServletRequest)control1.getMock();

5.       MockControl control2 = MockControl.createStrictControl(HttpServletResponse.class);

6.       HttpServletResponse mockHttpServletResponse =

7.               (HttpServletResponse)control2.getMock();

8.

9.       mockHttpServletRequest.getParameter("b");

10.      control1.setReturnValue("4", 1);

11.      mockHttpServletRequest.getParameter("a");

12.      control1.setReturnValue("3", 1);

13.

14.      final StringWriter output = new StringWriter();

15.      final PrintWriter contentWriter = new PrintWriter(output);

16.

17.      mockHttpServletResponse.setContentType("text/html");

18.      control2.setVoidCallable(1);

19.      mockHttpServletResponse.getWriter();

20.      control2.setReturnValue(contentWriter, 1);

21.

22.      control1.replay();

23.      control2.replay();

24.

25.      SimpleCalcServlet aServlet = new SimpleCalcServlet();

26.      aServlet.doGet(mockHttpServletRequest, mockHttpServletResponse);

27.

28.      control1.verify();

29.      control2.verify();

30.      assertEquals("Output should be an addition", "Result = 7", output.toString());

31.      }

 

可以看出,代码样式与MockObjects是完全一样的,只是细节上略有不同。

Line2Line5创建MockControl时,Line2创建的是一个不检查方法调用次序的ControllerLine5创建了一个检查方法调用次序的Controller。然后调用ControllergetMock()取得Mock实例。

Line9mockHttpServletRequest的训练中,直接调用了将要被被测代码调用的方法;然后Line10设定了调用这个方法的返回值和调用次数。最后,Line22Line23调用Controllerreplay()方法,表示训练结束,可以开始测试了。

MockCreator

MockObjectsEasyMock只能为接口(Interface)动态创建Mock Object实例,这对于已经养成了使用接口这个好习惯的我们来说,固然没什么好抱怨的J。然而世事不尽人意,更多的时候我们不得不为一些Class编写Mock实现,这时,类似MockCreator这一类能自动生成Mock Object实现的工具就派上用场了。

MockCreator可以用命令行形式生成Mock Object Class,也可以使用其官方提供的插件在Eclipse中方便的操作。下图就是使用MockCreator插件在Eclipse中生成Mock Object Class的操作方法:

 

 

对于上图所示的例子来说,自动生成的Mock Object Class的类名为MockHttpServletRequest,与HttpServletRequest放在同一个包下。

怎么样,非常简单就能生成一个Mock Object实现了,不是吗?J

再来看看利用它写的测试方法:

 

1.      public void testSimpleAdditionUsingMockCreator() throws Exception {

2.       final MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();

3.       final MockHttpServletResponse mockHttpServletResponse =

4.               new MockHttpServletResponse();

5.

6.      mockHttpServletRequest.startBlock();

7.       mockHttpServletRequest.expectGetParameter("b", "4");

8.       mockHttpServletRequest.expectGetParameter("a", "3");

9.       mockHttpServletRequest.endBlock();

10.

11.      final StringWriter output = new StringWriter();

12.      final PrintWriter contentWriter = new PrintWriter(output);

13.

14.      mockHttpServletResponse.expectSetContentType("text/html");

15.      mockHttpServletResponse.expectGetWriter(contentWriter);

16.

17.      SimpleCalcServlet aServlet = new SimpleCalcServlet();

18.      aServlet.doGet(mockHttpServletRequest, mockHttpServletResponse);

19.

20.      mockHttpServletRequest.verify();

21.      mockHttpServletResponse.verify();

22.      assertEquals("Output should be an addition", "Result = 7", output.toString());

23.  }

 

请注意,在Line6Line9分别调用了startBlock()endBlock()方法,这表示在最后验证的时候,不对Block内的方法调用次序进行检查。Line7Line8表示被测代码将分别以参数“b”、“a”调用getParameter()方法,届时mockHttpServletRequest将返回“4”、“3”。

总结

从上面的代码可以看出,使用这三个工具编写test方法的模式都完全一样,功能也基本相同,仅是他们提供的用户接口略有不同。

EasyMock虽然接口稍有复杂,但是使用起来也最为灵活,在测试一些递归等循环次数较多的方法时有独到之处。

MockObjectsMockCreator接口简单易用。但一个是动态Mock,一个是静态Mock,可以根据实际情况决定采用其中的哪个。

另外,在需要为Class建立Mock Object的情况下,就只有MockCreator能承此大任了。

最重要的,根据项目的实际需要,我们也可以同时采用多个工具来帮助我们进行测试,以满足不同的需求。

参考资料

1、  www.mockobjects.comMock Object Project的老家,致力于建立Mock Object标准框架。

2、  www.easymock.orgEasyMock,致力于提供一种简单的途径来帮助创建Mock Object

3、  mockcreator.sf.netMockCreator,自动生成Mock Object,提供了易用的Eclipse插件。

4、  www.mockmaker.orgMockMaker,与MockCreator类似的Mock Object自动生成工具。因在某些环境下不能正确的生成Mock Object实现,所以被排除在了此次比较之外。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值