您现在的位置是:首页 >

maventestmockmvc 利用spring2.5和Reflection简化测试中的mock[1]

火烧 2022-08-04 18:39:52 1033
利用 ri g2.5和Reflectio 简化测试中的mock[1]    ri g 最大的特色就是全面使用a otatio 代替xml配置 包括IOC Co tai er ri gMVC和 Te t

利用spring2.5和Reflection简化测试中的mock[1]  

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

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

maventestmockmvc 利用spring2.5和Reflection简化测试中的mock[1]

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

import static 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 上面的代码至少有两个方面是需要加强的

   需要大量的 mock 对象创建操作 与真正的 Test Case 无关的繁琐代码 而且还引入了对Spring Context Test 类的继承依赖   针对不同的 Test 类 因为用到不同的 mock 对象 每次都需要显式去指明 reset/replay/verify 用到的 mock 对象

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

   使用spring来替我们创建mock对象 由spring IOC Container在runtime注入需要的mock对象    提供更通用的rest/replay/verify机制来验证mock对象 而不是每个 Test 类都需要单独处理

lishixinzhi/Article/program/Java/ky/201311/29006  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码