随笔 - 3, 文章 - 1, 评论 - 2, 引用 - 0
数据加载中……

2007年10月5日

EasyMock简单用

        在实际编写unit test的过程中,很多情况下我们会需要使用其他的组件(如和数据库相关的测试)。当我们是使用第三方提供的组件时,这并不是太大的问题,因为我们可以假设他们是无错的。但是一旦这些组件是我们自己的组件时,问题就暴露出来了。

“单元测试出错了,但到底是谁的错。我的?他的?”,这种情况显然违反了测试的独立性原则。出现这种情况使得这个测试无法确切的指出是那个单元出现了问题,照成了排错的困难,而且也浪费了时间。同时,过分的将单元的测试代码依赖于其他单元,也照成了其他一些很现实的问题:

在所依赖的单元完成之前,无法顺利的编写单元测试。

产生环境的依赖性,如运行一个HttpServletRequest处理器的测试代码必须启动一个servlet容器。

所有这些问题,都可以使用Mock Object来解决。使用它的前提是,所依赖单元的接口必须定义清楚。而EasyMock正是为了这一目的而产生的。

使用目的

       通过模拟unit test所需要的组件,已达到隔离各个unit test的目的。目前的版本1.1,它所需要的环境是jdk1.3.1以上和junit3.8.1以上。

可以从http://sourceforge.net/projects/easymock/处下载。

用法

1.       EasyMock采用“记录-----回放”的工作模式,基本使用步骤:

-          创建Mock对象的控制对象Control

-          从控制对象中获取所需要的Mock对象。

-          记录测试方法中所使用到的方法和返回值。

-          设置Control对象到“回放”模式。

-          进行测试。

-          在测试完毕后,确认Mock对象已经执行了刚才定义的所有操作。

2.       使用举例:假设需要测试的对象是RequestUtil,所需要测试的方法为getBoolean。此时我们需要模拟一个HttpServletRequest对象。

public void testGetStringHttpServletRequestString() {

public void testGetBoolean() {

   //创建Mock对象的控制器

   MockControl  control= MockControl.createControl( HttpServletRequest.class);

   //获取Mock对象

   HttpServletRequest  mock= (HttpServletRequest)control.getMock();

   //设置getBoolean中要使用的方法和返回值

control.expectAndReturn( mock.getParameter( "test"), null);
            
        
//设置控制器为replay模式

        control.replay();

        //执行测试

        assertNull( RequestUtil.getString( mock, "test"));

        //确认

        control.verify();

    }

}

    通过EasyMock,执行这段测试代码完全不需要启动一个servlet容器,在命令行的方式下即可完成,非常的方便。

3.       记录需要使用的Mock的行为。在使用一个Mock对象之前,需要设置我们要用到的方法,以及每个方法的返回值。对于那些没有设置的方法,一旦调用(控制器处于replay模式),EasyMock就会抛出异常。记录一个方法,通常可以分成2:首先,如同使用正常对象调用这个方法;然后,使用控制器的setReturnValue函数设置即可。在1.1中,提供了expectAndReturn函数,使得2步可以合而为一。主要的函数大致如下:

-          expectAndReturn,设置期望调用的函数,以及返回值

-          expectAndThrow,设置期望调用的函数,同时期望该次调用抛出异常

-          setReturnValue,设置上一次调用的返回值(如上次调用时,request.getparameter( “test”),此处设置request.getparameter( “test”)的返回值)

-          setThrowable,设置上次调用抛出的异常

EasyMock中还可以设置调用所执行的次数,具体细节请参见对应的javaDoc

4.       使用举例:

MockControl  control= MockControl.createControl( HttpServletRequest.class);

HttpServletRequest  mock= (HttpServletRequest)control.getMock();

mock.getParameter( "test");

//设置第一次调用request.getParameter的返回值

control.setReturnValue( null, 1);

//设置第二次调用request.getParameter的返回值

control.setReturnValue("this is a test", 1);

control.replay();

assertEquals( RequestUtil.getString( mock, "test", "haha"), "haha");

assertEquals( RequestUtil.getString( mock, "test"), "this is a test");

control.verify();

5.       Mock对象使用结束后,务必调用控制器的verify函数,以确认Mock对象的方法得到了调用。

6.       调用方法的次序,使用Strict。有时,测试代码依赖于被依赖组件的方法的次序。如在测试与数据库相关代码时,测试代码很有可能是这样的次序:先打开数据库链接,执行操作,关闭链接。为了更好的测试这样的代码,可以使用MockControl.createStrictControl()来创建一个严格的Mock对象控制器,在其中,他会规定Mock出来的对象的调用次序。

以上是EasyMock的主要使用,至于其他的用法,请参见具体的文档。

PS:当自己动手实现Mock对象时,不要在Mock对象中实现业务逻辑。

posted @ 2007-10-05 15:33 patsYang 阅读(268) | 评论 (0)编辑 收藏

2007年1月17日

难道我们真的只是做我们应该做的吗?

我不知道自己是怎么回事!也不知道到底是因为什么!我的生活永远都是悲喜交加的!也许一天中就能发生许多的变化!而且也习惯了今天站在很高的地方!明天就摔得很惨!但是自己又是总喜欢说喜欢追求刺激的生活!但我最近我才发现,原来我所追求的生活是天天有追求有收获的!我可能害怕承担责任,但是我又想去承担很多的责任!因为在我看来,只要是领导交给我任务,就代表对我的信任!那么我会尽最大努力去做好!不知道是怎么回事!虽说刚刚上班没有多长时间!我也不知道这样算好算坏!我会把现在做的项目当成自己的事情!哪个地方出了问题!我可以很少睡觉!只是想不辜负任何人!但是我又知道在工作中结果比过程重要的多!所以我很失望,也很难受!很多的事情没有成功,我不知道是我错还是领导有问题!我并不是想追究责任,我只是不想当一件事情失败的时候,我所有的努力都不会再被看到!我可以以身体为代价来完成我的努力!只是为了想把事情做好!真的只是想能为领导分担些事情!但是当我真的抗不住的时候!我又能怎么办呢!也许工作中本不应该去努力替他人分担什么的!总之今天领导说了一句让我很是失望的话!也许可以说是有些伤心吧!所以我想我只做我能做的!做我应该做的!

posted @ 2007-01-17 20:57 patsYang 阅读(221) | 评论 (2)编辑 收藏

2006年12月27日

my heart

   刚刚出来工作!连自己都不知道为什么能进入这家公司!不过我的确很是高兴!我真的是一直都在努力!现在正在出差!每天都要工作到11点多!也有很多时候是要通宵!不过我很开心!因为我现在过得很是充实!而且我也想来证明自己!我想用我的行动告诉公司的所有人!虽然我现在不是很强!但是我很努力!我会去努力的学习!我一定会在公司中成为重要的角色!
   现在工作这边只有我一个人!很多事情都在我的身上!这几天几乎就没有怎么睡觉!我唯一想做的就是能够把事情做好!可是真的是遇到了很多困难!每天写工作日志的时候都不知道应该如何去写!因为这几天工作日志几乎就是一样的!不是怕领导会说什么!只不过真的觉得自己很没用啊!(只是发泄!觉得没有泄气!哈哈!)真的觉得自己好让人失望啊!呵呵!现在又要写工作日报了!调节一下自己!完了继续开工了!我会告诉自己!尽最大的努力!做好自己的事情!虽然工作讲求效率!虽然我有很多的不会!但是至少我是尽力的!我做到无愧于心!我想就够了!
   我会继续努力!因为 大丈夫!横行天下!

posted @ 2006-12-27 22:28 patsYang 阅读(170) | 评论 (0)编辑 收藏