操作Ruby简化你的Java测试(进阶篇)[Java编程]
本文“操作Ruby简化你的Java测试(进阶篇)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
本文是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测试(进阶篇)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |