spring最大的特色就是全面使用annotation代替xml配置包括IOC ContainerspringMVC和 TestContext测试框架等给我们开发带来了极大的便利springMVC的新特性在这篇文章里面已经有了比较详尽的介绍而对于spring的新TestContext测试框架大家也可以从这里得到详细的例子说明有兴趣的可以去仔细阅读本文不再赘述总而言之通过spring提供的 annotation我们可以让我们的类——包括controllerTest等职责特殊的类——更 POJO 化更易于测试也提高了 TestCase的开发效率
在开发过程中我们通常需要mock特定的对象来测试预期行为或者使用stub对象来提高单元测试效率最常见的例子就是在多层webapp中在controller类的测试方法里mock或 stub底层dao类的方法从而减轻单元测试时数据库操作的开销加快单元测试速率至于Reflection已不是java的新概念了各样框架基本上都有使用Reflection来增强Runtime的动态性而java里Reflection效率的提升和annotation的引入更是极大地提高java语言的动态性让开发人员得到更多Runtime的灵活性本文将演示如何使用spring和Reflection简化测试中的 mock使用的JUnit框架是JUnitmock框架是Easymock
让我们先看看最原始的使用mock对象的测试(假设基于jdk进行开发使用了包括static importvarargs等新特性)
import static orgeasymockEasyMock*;
public void HelloworldTest extends AbstractSingleSpringContextTests {
private Foo foo = createMock(Fooclass);
private Bar bar = createMock(Barclass);
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);
helloworldsayHello();
//assert verification
}
//
}
可以看到因为使用了 Spring 老版本的 TestContext上面的代码至少有两个方面是需要加强的
需要大量的 mock 对象创建操作与真正的 Test Case 无关的繁琐代码而且还引入了对Spring Context Test 类的继承依赖
针对不同的 Test 类因为用到不同的 mock 对象每次都需要显式去指明 reset/replay/verify 用到的 mock 对象
针对上面的两个问题我们有相应的解决方案来改进
使用spring来替我们创建mock对象由spring IOC Container在runtime注入需要的mock对象
提供更通用的rest/replay/verify机制来验证mock对象而不是每个 Test 类都需要单独处理
[] [] []