快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
行测试了。上一篇中我介绍了Ruby的测试框架,不过这次,我们学习一个新的测试框架dust,它可以让你以更简洁的方式书写测试:

import "org.easymock.samples.ClassUnderTest" import "org.easymock.samples.Collaborator" unit_tests do    cut = ClassUnderTest.new    mock = Collaborator.new #=> mock一个接口只需直接new出来即可    cut.addListener(mock)

#测试方法以test开始,后面跟一段具有描述性的字符串,然后在block中完成测试逻辑

test "001 remove none existing document" do      cut.removeDocument("Does not exist")    end end

将上述代码拷贝至src/test/ruby下,运行mvn test命令,OK,通过了相关测试。非常简单吧!dust甚至让我们不用声明任何类就可以开始工作了,处处都体现着ruby简单、高效的理念!

加速

跑过几次单元测试后,大家一定会发现测试代码是很容易书写,但是跑测试的时间似乎有点长!难道JRuby的性能这么差?其实整个测试过程中启动JRuby花费了很多时间,JtestR框架也考虑的很周到,只需要启动一个本地的测试服务器就可以大大加快测试执行的速度,在shell中执行mvn jtestr:server即可。再跑一次单元测试,速度大大增加了吧!

上面的代码只测试了删除一个不存在的文档,逻辑太过简单,不能说明任何问题,我们继续后面的测试,新增一个文档:

test "002 add document" do      mock.expects(:documentAdded).with("New Document") #=> 我们期待documentAdded被执行,并且title的值为“New Document”      cut.addDocument("New Document", [])    end

运行测试,居然出错了,TypeError: for method addDocument expected [java.lang.String, [B]; got: [java.lang.String,org.jruby.RubyArray,原来错在cut.addDocument("New Document", [])的方法中我简单传入了[],这是一个Ruby数组对象,将这段代码改成:

cut.addDocument("New Document", [].to_java(:byte))

重新运行测试,OK,全部通过。在JRuby中进行测试时调用Java对象的方法要注意将Ruby对象转换成Java对象。我们对比一下JUnit的代码

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

Ruby代码还是稍稍比Java代码简洁一些,虽然优势不明显。我们继续完成后续的测试,增加并改变一个文档:

test "003 add and change document" do    mock.expects(:documentAdded).with("Document")    #在ClassUnderTest实现逻辑中,后续增加的同名文档属于修改操作,所以documentChanged事件被触发了三次    mock.expects(:documentChanged).with("Document").times(3) #=> DSL here    cut.addDocument("Document", [].to_java(:byte))    cut.addDocument("Document", [].to_java(:byte))    cut.addDocument("Document", [].to_java(:byte))    cut.addDocument("Document", [].to_java(:byte)) end

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

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

运行测试,全部通过!请大家注意mock.expects(..).with(..).times(3)这行代码,代码本身似乎就在说我期望这个对象的XXX方法被调用,参数是xx,并且一共被调用了3次。书写简洁,阅读也非常的语义化!这就是我们所说的DSL(Domain Specific Language),mocha就是Ruby在

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