快速业务通道

利用Ruby简化你的Java测试(进阶篇) - 编程入门网

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

利用Ruby简化你的Java测试(进阶篇)

时间:2011-01-27 infoq 殷安平

本文是Productive Java with Ruby系列文章的第二篇,通过上一篇的介绍,我想大家对如何利用Ruby进行单元测试有了一个基本的了解,从这里开始,我将和大家一起讨论一些利用Ruby进行单元测试时的高级话题。

通常,新技术的引入只能降低解决问题的难度,而不是消除问题本身!

在“依赖”的原始丛林中挣扎...

通过Ruby我们可以更高效的处理数据准备的问题,但是真实的世界并不那么简单!随着测试的深入,我们会越发的感觉一不小心就挣扎在“依赖”的原始丛林中!有时候似乎需要加入无数的jar包,初始化所有的组件,配置完一切的数据库、服务器及网络的关系,才能开始一小段简单的测试。更痛苦的是这一切是如此的脆弱,仅仅是某人在数据库中多加了一条数据或者更改了一部分环境配置,你苦心构建的所有测试就全部罢工了!多少次,你仰天长叹:“神啊!救救我吧...”。可神在那里呢?

Mock

单元测试之所以有效,是因为我们遵从了快速反馈,小步快跑的原则!一次只测试一件事情!而大量依赖的解决工作明显让单元测试偏离的原本的目标,也让人觉得不舒服。Mock技术就能让我们有效摆脱在丛林中的噩梦。我们知道,在计算机的世界里,同样的输入一定能得到对应的输出,否则就是异常情况了。Mock技术本质上是通过拦截并替换指定方法的返回值摆脱对程序实现的依赖。对于1+1这样的输入条件进行计算,Mock技术直接拦截原方法,替换该计算方法的返回值为2,不关心这个算法到底是通过网络得到的,还是通过本地计算得到的。这样就和具体实现解藕了。

在对Java进行单元测试的时候,通常会对某个具体类或某个接口产生依赖,要解藕就需要能够对具体类或接口进行Mock。幸好这些在JRuby中都非常的简单,由于JtestR自动为我们引入了mocha这个Mock框架,让我们可以更简单的开始工作。先看一个针对HashMap的Mock测试吧:

map = mock(HashMap)      #=> mock java.util.HashMap类,如果是接口可以直接new出来,例如Map.new map.expects(:size).returns(5) #=> 模拟并期望调用size方法时返回5 assert_equal 5, map.size    #=>断言,和JUnit断言非常相似

EasyMock是个流行的开源Java Mock测试框架,在它的官方网站的文档中刚好有如何利用Mock进行测试的示例,为了方便说明,我将直接引用这个示例,并用JRuby实现基于Mock的测试。首先我们有一个接口:

//协作者接口,用以跟踪协作文档的相关状态 public interface Collaborator {    void documentAdded(String title); //当新增文档时触发    void documentChanged(String title); //当文档改变时触发    void documentRemoved(String title); //当文档被删除时触发    byte voteForRemoval(String title); //当文档被共享,并进行删除操作是,执行投票的动作    byte[] voteForRemovals(String[] title); //同上,不过可以同时投票多个文档 }

在这个示例中,还有一个ClassUnderTest类实现了管理协作文档的相关逻辑,简化示例代码如下:

public class ClassUnderTest {    // ...      public void addListener(Collaborator listener) {      // 增加协作者    }    public void addDocument(String title, byte[] document) {      // ...    }    public boolean removeDocument(String title) {      // ...    }    public boolean removeDocuments(String[] titles) {      // ...    } }

利用Ruby简化你的Java测试(进阶篇)(2)

时间:2011-01-27 infoq 殷安平

到这里开始,我们就可以开始利用JRuby进

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号