`

推荐升级easymock到新的3.0版本

阅读更多
    一直在使用easymock作为mock工具,但是easymock有一个一直令我极其恼火的地方:easymock将interface和class的mock区分开,给出了针对interface mock的easyMock和针对class mock的easyMock class extension。两种mock被严格区分开,连jar包都是两个,使用时不能混用,比如不能用easymock (非class extension)来mock class。

    这也就算了,最要命的地方是,easyMock和easyMock class extension在使用时,class名是相同的,只是package不同。这会导致一个非常令人抓狂的问题:如果在同一个测试类中,需要同时使用interface mock和class mock,就必须同时使用org.easymock.EasyMock和org.easymock.classextension.EasyMock,由于java import只能import一个,因此另外一个就必须使用全限定名,如:

import org.easymock.EasyMock;
...
    Easymock.createMock(...);
    org.easymock.classextension.EasyMock.createMock(...);

    编码的时候稍有不慎就搞错,代码难写而且难看。很明显,这是一个没有必要的设计,因为使用者通常并不关心mock的是interface还是class。

    近日得知easymock已经发布了新的3.0版本,该版本的主要改进就是消除上述的问题,新版本中可以直接mock class,不再强制使用easyMock class extension。

    以下是easymock官网 http://easymock.org/ 的发布信息:

010-05-08: EasyMock 3.0 is available. Perform class mocking directly. EasyMock 1 classes removed.
2010-05-08: EasyMock 3.0 Class Extension is available. Now deprecated. Only a proxy over EasyMock to provide backward compatibility.

    可以看到为了兼容2.*版本的就有代码,3.0之中还是发布了Class Extension版本,作为旧有的2.*代码和新的3.0之间的代理。不过明确标记为"deprecated"了。

    试用了一下,新的3.0版本中,直接使用org.easymock.EasyMock,可以在同一个case中同时混合mock interface和class,使用方式和以往相同。恩,明显感觉使用方便了许多。

    顺便做了一下兼容性测试,针对旧有的使用2.*版本的class mock的测试案例,尝试使用两种方法:

    1. 不修改原有代码,使用3.0的class extension来保持兼容
代码编译通过,测试案例正常运行。
这个方案适合项目较大时先整体升级,保证测试案例可以运行,后续再逐步转移到3.0版本。

    2. 修改原有代码,不再使用class extension
代码只需一个改动,即将原有的org.easymock.classextension.EasyMock 修改为org.easymock.EasyMock,通常只要简单修订import即可。eclispe下简单ctrl +shit + o一招即可搞定。

    两个方法组合使用,就可以平稳的将原有的2.*的测试案例转移到新的3.0版本中。

    强烈推荐还在使用easymock 2.*的朋友们升级到3.0版本。
分享到:
评论
13 楼 skydream 2010-07-10  
xupo 写道
刚把maven的easymock 从2.3升级到3.0
不错.看了下maven的repo1,发现easymock 3.0 是2010年5月8日提交的.


是的,新版本刚发布不久。

我是经同事告知才知道3.0发布的。发这个帖子出来,就是希望能帮到和我一样被class extension困扰的朋友升级到3.0。
12 楼 xupo 2010-07-10  
刚把maven的easymock 从2.3升级到3.0
不错.看了下maven的repo1,发现easymock 3.0 是2010年5月8日提交的.
11 楼 daquan198163 2010-07-08  
ilove2009 写道
本人赞成要做单元测试的,但往往工期很紧张。没办法,能省就省(设计、文档、评审都没有,呵呵)。

本人赞成要多运动,但往往工作忙、应酬多,所以……
10 楼 ilove2009 2010-07-08  
skydream 写道
ilove2009 写道
archerfrank 写道
skydream 写道
ilove2009 写道
几年前用过easymock,现在项目中基本没有单元测试。有,顶多也是写个main方法跑一把。


这个,未免强大了点,你们是怎么保证代码质量的?

传说中的单元测试无用论,直接集成测试。。。


我们是分层开发的,基本上算是集成测试吧。目前还不知道有那些技术能给B/S结构的做完整的单元测试。



给B/S结构的做完整的单元测试确实不容易,不过即使抛开B不谈,你的S端总的有单元测试吧?

s端的业务逻辑,实现逻辑这些都是可以用单元测试来保证质量的,我相信你们的s端怎么也不至于简单到只要得到两个参数a,b,然后直接return (a + B)这么简单吧?

本人赞成要做单元测试的,但往往工期很紧张。没办法,能省就省(设计、文档、评审都没有,呵呵)。
9 楼 skydream 2010-07-07  
ilove2009 写道
archerfrank 写道
skydream 写道
ilove2009 写道
几年前用过easymock,现在项目中基本没有单元测试。有,顶多也是写个main方法跑一把。


这个,未免强大了点,你们是怎么保证代码质量的?

传说中的单元测试无用论,直接集成测试。。。


我们是分层开发的,基本上算是集成测试吧。目前还不知道有那些技术能给B/S结构的做完整的单元测试。



给B/S结构的做完整的单元测试确实不容易,不过即使抛开B不谈,你的S端总的有单元测试吧?

s端的业务逻辑,实现逻辑这些都是可以用单元测试来保证质量的,我相信你们的s端怎么也不至于简单到只要得到两个参数a,b,然后直接return (a + B)这么简单吧?
8 楼 ilove2009 2010-07-07  
archerfrank 写道
skydream 写道
ilove2009 写道
几年前用过easymock,现在项目中基本没有单元测试。有,顶多也是写个main方法跑一把。


这个,未免强大了点,你们是怎么保证代码质量的?

传说中的单元测试无用论,直接集成测试。。。


我们是分层开发的,基本上算是集成测试吧。目前还不知道有那些技术能给B/S结构的做完整的单元测试。
7 楼 archerfrank 2010-07-06  
skydream 写道
ilove2009 写道
几年前用过easymock,现在项目中基本没有单元测试。有,顶多也是写个main方法跑一把。


这个,未免强大了点,你们是怎么保证代码质量的?

传说中的单元测试无用论,直接集成测试。。。
6 楼 skydream 2010-07-06  
ilove2009 写道
几年前用过easymock,现在项目中基本没有单元测试。有,顶多也是写个main方法跑一把。


这个,未免强大了点,你们是怎么保证代码质量的?
5 楼 ilove2009 2010-07-05  
几年前用过easymock,现在项目中基本没有单元测试。有,顶多也是写个main方法跑一把。
4 楼 skydream 2010-06-30  
daquan198163 写道


另外,你们为何结合使用两个mock框架,只用jmockit一个不可以么?
像我现在就是完全用mockito代替easymock了



这个我还真不大清楚,稍后再问问同事。我加入前就是easymock + jmockit了。

惭愧的说在此之前我还真不知道jmockit的存在,也不知道原来static方法也是可以mock的。

我猜测啊,可能是开始用easymock,后来发现有些地方easymock搞不定,因此作为补充引入的jmockit。从我看到的测试代码上看,jmockit目前都是在这些对于easymock来说比较难受的地方在使用。jmockit 自己的expection, verification好像没有看到。

正在研究jmockit中,上面引用的那个特性列表,哎,不能不再此惭愧一下,很多特性我都是不知道它的存在的,等稍后仔细过一遍在说。
3 楼 daquan198163 2010-06-29  
skydream 写道
daquan198163 写道
推荐mockito


推荐的理由是什么?能简单说一下吗?mockito我还没有接触过,不大清楚。

我们这边在用jmockit,来解决一些easymock无法做到的问题,比如模拟静态方法。

这里有一个jmockit给出来的特性对比列表,mockito也在其中。

http://code.google.com/p/jmockit/wiki/MockingToolkitComparisonMatrix

当然这个是jmockit给出来的,可能不是很公正。不过大体上看,jmockit还是很强大的。

因为mockito完全可以代替easymock,而且语法简单,功能更强,所以推荐。
jmockit我都没听说过,哈哈,看那个比较貌似jmockit更强,比如可以mock静态方法。

另外,你们为何结合使用两个mock框架,只用jmockit一个不可以么?
像我现在就是完全用mockito代替easymock了

mockito的优点很多,比较有特色的是这两个:
Argument matchers
Sometimes, when extra flexibility is required then you might use argument matchers:
//stubbing using built-in anyInt() argument matcher
when(mockedList.get(anyInt())).thenReturn("element");

Stubbing consecutive calls (iterator-style stubbing)
Sometimes we need to stub with different return value/exception for the same method call. Typical use case could be mocking iterators. Original version of Mockito did not have this feature to promote simple mocking. For example, instead of iterators one could use Iterable or simply collections. Those offer natural ways of stubbing (e.g. using real collections). In rare scenarios stubbing consecutive calls could be useful, though:

when(mock.someMethod("some arg"))
   .thenThrow(new RuntimeException())
   .thenReturn("foo");

//First call: throws runtime exception:
mock.someMethod("some arg");

//Second call: prints "foo"
System.out.println(mock.someMethod("some arg"));

//Any consecutive call: prints "foo" as well (last stubbing wins).
System.out.println(mock.someMethod("some arg"));


Alternative, shorter version of consecutive stubbing:

when(mock.someMethod("some arg"))
   .thenReturn("one", "two", "three");

http://mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/Mockito.html
2 楼 skydream 2010-06-28  
daquan198163 写道
推荐mockito


推荐的理由是什么?能简单说一下吗?mockito我还没有接触过,不大清楚。

我们这边在用jmockit,来解决一些easymock无法做到的问题,比如模拟静态方法。

这里有一个jmockit给出来的特性对比列表,mockito也在其中。

http://code.google.com/p/jmockit/wiki/MockingToolkitComparisonMatrix

当然这个是jmockit给出来的,可能不是很公正。不过大体上看,jmockit还是很强大的。





1 楼 daquan198163 2010-06-28  
推荐mockito

相关推荐

    easymock-3.0.jar

    java运行依赖jar包

    easymockclassextension-3.0.jar

    easymockclassextension-3.0.jar org.easymock.classextension.EasyMock.

    jmock2.5.1和easymock3.0

    1. 将下载的`jmock-2.5.1`和`easymock-3.0`库文件添加到项目的类路径中。 2. 引入对应的测试依赖,如`junit.jar`。 3. 创建测试类,导入JMock或EasyMock的相关API。 4. 在测试方法中,使用`createMock`或`...

    Learning EasyMock3.0 By Official Example

    总结来说,《Learning EasyMock3.0 By Official Example》是一个深入了解和掌握 EasyMock 的宝贵资源。通过学习官方示例,开发者不仅能学会如何创建和管理模拟对象,还能了解如何在实际项目中有效地应用这些技术,...

    easyMock3.0

    有用的jar包 是我好不容易找到的 现在分享给大家了

    easymock 3.0

    在压缩包文件`easymock-3.0`中,可能包含了Easymock 3.0的库文件,例如jar包,你可以将其导入到你的项目中,以便开始使用这个强大的模拟框架进行单元测试。 总结来说,Easymock 3.0是Java单元测试的重要工具,通过...

    junit4.4.jar +easymock3.0.jar

    在提供的压缩包文件名称"junit4.6+easymock3.0"中,尽管标题提到的是4.4版本的JUnit,但这里可能是4.6版本的JUnit,这可能意味着更新或升级的版本。4.6版本相对于4.4版本会有一些额外的改进和修复,例如更多的注解...

    easymock-3.0-sources.jar

    jar包,官方版本,自测可用

    easymock-3.0-samples.jar

    jar包,官方版本,自测可用

    easymockclassextension-3.0-sources.jar

    jar包,官方版本,自测可用

    easymock3.1最新帮助文档chm格式

    easymock3.1最新帮助文档chm格式

    easymock-3.0.jar中文-英文对照文档.zip

    (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...

    EasyMock入门

    **EasyMock 3.0 版本特性:** - 支持Java 5和6。 - 引入了更多预定义的匹配器,如`eq()`(等于)、`anyObject()`(任何对象)等,方便匹配方法参数。 - 改进了API设计,使其更易于理解和使用。 - 提供了更强大的...

    EasyMock

    在工具方面,EasyMock提供了方便的API和集成到各种测试框架(如JUnit)的能力,使得开发者可以轻松地在测试代码中使用模拟对象。此外,EasyMock还支持扩展,比如通过EasyMock Class Extension来模拟静态方法和最终类...

    easymock-3.2.zip

    在EasyMock 3.2这个版本中,主要包含以下几个组成部分: 1. **API文档**:这是EasyMock的接口文档,详细描述了各个类和方法的使用方法、参数和返回值,是开发者理解和学习EasyMock的关键资料。通过阅读API文档,你...

    easyMock

    EasyMock 是一个强大的Java模拟框架,它允许开发者在单元测试中创建和控制对象的行为,以模拟复杂的依赖关系。这个框架的出现使得测试更加简洁、独立,可以有效地验证代码的正确性,而无需运行实际的依赖服务或库。...

    easymock

    标题中的“easymock”是指一个开源的Java模拟框架,它允许开发人员在测试时创建模拟对象,以便于隔离被测试代码并确保其独立于其他依赖。EasyMock提供了简单的API来定义对象的行为,比如期望调用的方法和返回值,这...

    easymock.jar,easymockclassextension.jar

    Easymock是一个流行的Java单元测试框架,它允许开发者创建模拟对象来测试代码。这个框架使得测试更加简单,因为你可以模拟任何复杂的交互和行为,而无需实际运行依赖的组件。在给定的压缩包文件中,包含两个核心的...

    easymock.jar包

    在给定的压缩包中,我们看到的是easymock-3.3版本,这是Easymock的一个稳定版本,包含了针对Java 6及更高版本的支持。 Easymock的核心概念包括模拟(Mocking)和期望(Expectations)。模拟是创建一个对象的行为...

Global site tag (gtag.js) - Google Analytics