快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
Mock测试方面的领域化语言!它支持的语义非常的丰富,包括:

at_least  at_least_once  at_most  at_most_once  in_sequence  never  once  raises  returns  then  times  when

等等。DSL的应用是Ruby的一大特点,它甚至能让我们写出连客户都能很容易看懂的测试代码。这在敏捷实践中,与用户讨论接收测试时就显得非常有用及必要!我们也同样对比一下JUnit和EasyMock的实现:p

@Test public void addAndChangeDocument() {   mock.documentAdded("Document");   mock.documentChanged("Document");   expectLastCall().times(3);   replay(mock);    classUnderTest.addDocument("Document", new byte[0]);    classUnderTest.addDocument("Document", new byte[0]);    classUnderTest.addDocument("Document", new byte[0]);    classUnderTest.addDocument("Document", new byte[0]);    verify(mock); }

EasyMock属于非常正常的API调用,没有太多DSL的概念,在这方面JMock相对来说要好一些,不过和Ruby相比,表达相同的语义,还是更繁琐一些。我们继续完成最后一段测试代码,删除及投票:

test "004 vote for removel" do    mock.expects(:voteForRemoval).with("Document").returns(42)    mock.expects(:documentRemoved).with("Document")    assert_equal true, cut.removeDocument("Document") end

看到这里,细心的同学一定会发现有些奇怪,并没有先增加一个Tilte是Document呀?是的,这个是Ruby的单元测试和Java机制不一样的地方,JUnit中,每个方法是在线程中执行的,不保证被执行的先后顺序,而Ruby的单元测试是简单反射,按字母排序后执行的,所以只有一个上下文环境。我特意在每个方法的描述前加了个数字序列,以保证按这个数字的大小顺序执行!

好了,到这里,对利用Ruby进行Mock测试介绍基本完成!剩余的EasyMock的示例测试留给大家自己完成吧!

总结

引入Ruby进行Mock测试可以有效简化单元测试时对各种环境的依赖,但是Mock也有Mock自己的问题,例如,它需要你对被测试类的内部细节有一定的了解,毕竟利用Mock技术进行测试属于白盒测试。当被测试类的内部实现有所改变而外部接口未发生变化时,原本不该出错的测试方法依旧有被打破的风险。还是回到开篇的那句话:通常,新技术的引入只能降低解决问题的难度,而不是消除问题本身!

作者介绍:殷安平,现任阿里软件研究院平台二部架构师,工作6年以来一直从事Java开发,爱好广泛,长期关注敏捷开发。对动态语言有了强烈的兴趣,致力于将动态语言带入实际工作中!工作之余喜欢摄影和读书。个人RSS聚合: http://friendfeed.com/yapex。联系方式:anping.yin AT alibaba-inc.com。

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