分享
 
 
 

工欲善其事,必先利其器之easymock篇

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

在做项目的时候,经常看见很多兄弟们在做一些无用功,其实,现在Java语言已经形成了一个形形色色的生态圈,在这个生态圈里,有IT巨鳄的IBM,有两头受气的Sun,还有各种各样为我们提供工具的开源社区,如Apache,eclipse,freshmeat,sourceforge,netbeans等。此外,J2SE 5.0推出以后也为我们节省了不少工作。我们完全可以利用这些资源,节省很多为老板干活的时间,从而将有限的生命投入到无限的泡MM事业中去。

闲言少叙,dingdang预备写个系列文章,讲述一些工具,API以及其背后的原理。兄弟抛块砖先,有玉的尽管砸过来,我闪

一,测试工具EasyMock

在这个系列文章中以测试开始,把它作为我们这篇入门介绍文档的开头,不是偶然的,正如村上春树在《挪威的森林》里面说的那样,死并不是生的对立面,而是作为生的一部分而存在。测试也不是开发的对立面,而是作为开发的一部分而存在,我们总是在不断的写代码,单元测试,写代码,单元测试......作为单元测试的工具JUnit框架大家可能已经耳熟能详,Martin Fowler对它的评价是"Never in the field of software development was so mUCh owed by so many to so few lines of code"。一时AUnit,BUnit,仿效者无数。可谓武林至尊

可是,仅仅JUnit是不够的。我们在做项目的时候就碰到了这样的场景:

大米:终于写完代码了,可以上QQ泡MM了.....

dingdang:哦,写完了,给个测试用例先。

大米:没法子给测试用例啊,我写的这个类要用到苞谷写的类耶

dingdang去找苞谷:苞谷,你的代码怎么还没写完啊,搞的大米连单元测试都做不了。

苞谷:不是我得错,苹果没有写完我需要的类

苹果:也不是我得错,大米没有写完我需要的类

dingdang:×※……%¥

其实,这些类的依靠关系首先是违反了一个原则:The Dependency Inversion Principle(依靠转置原则)

抽象不应该依靠于细节,而细节应该依靠于抽象。

高层的模块不应该依靠于底层的模块,它们都应该依靠于抽象

通俗一点的说,就是,我们在做Java设计的时候,应该尽可能的依靠于接口而不是实现。

dingdang嘿嘿奸笑两声:大米啊,我们修改一下设计吧,把我们的设计refactoring一下。

三分钟后,大米说:dingdang啊,改成接口还是没法子测试啊。

dingdang再次狂笑:哈哈,倚天不出,谁与争锋,看我的easymock!!!!!

easymock软件安装很简单,先到以下地址下载一个最新的zip包: www.easymock.org,下载完以后将easymock.jar包加到你的系统的CLASSPATH环境变量中,对于IDE环境,对于需要用到的junit的项目增加到lib中,不同的IDE有不同的设置,这里不多讲。

easymock的优点在于模拟接口的行为,(新版的easymock利用cglib据说也可以模拟类的行为,没有试用过:P)假如你有一个类HelloWorld,依靠接口DependentInterface,easymock就可以在运行的时候生成DependentInterface接口的实现。这些实现的行为和返回值都可以在单元测试代码里面指定。我们用一个JUnit例子来进行说明

首先,需要导入MockControl类,如下样例中的第一步,

然后选择一个接口,创建这个接口的模拟实例,如以下样例中的第二步。

最后,先模拟一下你希望的类的行为,如返回值等,调用MockControl类的replay方法:

import junit.framework.*;

import org.easymock.MockControl;// step 1

interface DependentInterface{

public String sayHello();

}

class HelloWorld{

private DependentInterface dp_;

public HelloWorld(DependentInterface dp){

dp_ = dp;

}

public String sayAnotherHello(){

return dp_.sayHello();

}

}

public class TestHelloWorld extends TestCase {

private HelloWorld helloWorld_ = null;

private MockControl control_;

private DependentInterface dp_;

protected void setUp() throws Exception {

super.setUp();

control_ = MockControl.createControl(DependentInterface.class);//step 2

dp_ =(DependentInterface)control_.getMock();//step 2

helloWorld_ = new HelloWorld(dp_);

}

protected void tearDown() throws Exception {

helloWorld_ = null;

super.tearDown();

}

public void testSayHello() {

dp_.sayHello();//step 3

control_.setReturnValue("hello");//step 3

control_.replay();//step 3

String actualReturn = helloWorld_.sayAnotherHello();

assertEquals(actualReturn,"hello");

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有