快速业务通道

利用Spring2.5和Reflection简化测试中的mock - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

利用Spring2.5和Reflection简化测试中的mock

时间:2011-08-31

spring2.5最大的特色就是全面使用annotation代替xml配置,包括IOC Container、springMVC和 TestContext测试框架等,给我们开发带来了极大的便利。springMVC的新特性在这篇文章里面已经有了比较详尽的介绍,而对于spring的新TestContext测试框架,大家也可以从这里得到详细的例子说明,有兴趣的可以去仔细阅读,本文不再赘述。总而言之,通过spring2.5提供的 annotation,我们可以让我们的类——包括controller,Test等职责特殊的类——更 POJO 化,更易于测试,也提高了 TestCase的开发效率。

在开发过程中,我们通常需要mock特定的对象来测试预期行为,或者使用stub对象来提高单元测试效率。最常见的例子就是在多层webapp中,在controller类的测试方法里mock或 stub底层dao类的方法,从而减轻单元测试时数据库操作的开销,加快单元测试速率。至于Reflection,已不是java的新概念了,各样框架基本上都有使用Reflection来增强Runtime的动态性。而java5里Reflection效率的提升和annotation的引入,更是极大地提高java语言的动态性,让开发人员得到更多Runtime的灵活性。本文将演示如何使用spring2.5和Reflection简化测试中的 mock,使用的JUnit框架是JUnit4.4,mock框架是Easymock2.4。

让我们先看看最原始的使用mock对象的测试(假设基于jdk5进行开发,使用了包括static import,varargs等新特性):

import static org.easymock.EasyMock.*;public void HelloworldTest extends AbstractSingleSpringContextTests {  private Foo foo = createMock(Foo.class);  private Bar bar = createMock(Bar.class);  private Helloworld helloworld;  @Before  public void before() {    reset(foo, bar);    helloworld = new Helloworld(foo, bar);  }  @After  public void after() {    verify(foo, bar);  }  @Test  public void shouldSayHello() {    //set expectations about foo/bar    replay(foo, bar);    helloworld.sayHello();    //assert verification  }  //}

可以看到,因为使用了 Spring 老版本的 TestContext,上面的代码至少有两个方面是需要加强的:

1. 需要大量的 mock 对象创建操作,与真正的 Test Case 无关的繁琐代码,而且还引入了对Spring Context Test 类的继承依赖

2. 针对不同的 Test 类,因为用到不同的 mock 对象,每次都需要显式去指明 reset/replay/verify 用到的 mock 对象

利用Spring2.5和Reflection简化测试中的mock(2)

时间:2011-08-31

针对上面的两个问题,我们有相应的解决方案来改进:

1. 使用spring来替我们创建mock对象,由spring IOC Container在runtime注入需要的mock对象

2. 提供更通用的rest/replay/verify机制来验证mock对象,而不是每个 Test 类都需要单独处理

1. 每个mock对象都需要手工创建么?答案当然是否定的,我们有FactoryBean。通过在配置文件中指定bean的定义,让spring来替我们创建mock对象。如下是针对Foo类的定义:

<bean id="mockFoo" class="org.easymock.EasyMock" factory-method="createMock">  <constructor-arg index="0" value="Foo"/></bean>< /constructor-arg>

与此同时,Spring TestContext框架提供了 @ContextConfiguration annotation 允许开发人员手工指定 Spring 配置文件所在的位置。这样,开发过程中,如果开发人员遵循比较好的配置文件组织结构,可以维护一套只用于测试的对象关系配置,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号