首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

easymock课程-mock的限制

2012-06-29 
easymock教程-mock的限制??? easymock并不是万能的,在使用easymock时有一些限制需要注意。?(1) Object方法

easymock教程-mock的限制

??? easymock并不是万能的,在使用easymock时有一些限制需要注意。

?

(1) Object方法的限制

??? 我们都知道java是一个单根继承体系,Object是所有类的基类。在Object类上有几个基本的方法,easymock是不能改变其行为的:equals(), hashCode()和toString()。

?

??? 即对于easymock创建的mock对象,其equals(), hashCode()和toString()三个方法的行为时已经固定了点,不能通过Easymock.expect()来指定这三个方法的行为,即使这三个方法是接口定义的一部分。

?

??? 我们来先看一个例子:

easymock课程-mock的限制easymock课程-mock的限制???public?class?Business?{
easymock课程-mock的限制????????private?Service?service;
easymock课程-mock的限制
easymock课程-mock的限制easymock课程-mock的限制????????public?void?execute()?{
easymock课程-mock的限制????????????System.out.println("service.toString()?=?"?+?service.toString());
easymock课程-mock的限制????????????System.out.println("service.hashCode()?=?"?+?service.hashCode());
easymock课程-mock的限制????????}
easymock课程-mock的限制
easymock课程-mock的限制easymock课程-mock的限制????????public?void?setService(Service?service)?{
easymock课程-mock的限制????????????this.service?=?service;
easymock课程-mock的限制????????}
easymock课程-mock的限制????}
easymock课程-mock的限制
easymock课程-mock的限制easymock课程-mock的限制????private?interface?Service?{
easymock课程-mock的限制
easymock课程-mock的限制????????public?String?toString();
easymock课程-mock的限制
easymock课程-mock的限制????????public?int?hashCode();
easymock课程-mock的限制????}
easymock课程-mock的限制

??? execute()方法将为我们打印出toString()和hashCode()方法的结果。

easymock课程-mock的限制easymock课程-mock的限制public?class?LimitationTest?{
easymock课程-mock的限制
easymock课程-mock的限制????private?Business??????business;
easymock课程-mock的限制
easymock课程-mock的限制????private?IMocksControl?mocksControl;
easymock课程-mock的限制
easymock课程-mock的限制????private?Service???????service;
easymock课程-mock的限制
easymock课程-mock的限制????@Before
easymock课程-mock的限制easymock课程-mock的限制????public?void?init()?{
easymock课程-mock的限制????????business?=?new?Business();
easymock课程-mock的限制????????mocksControl?=?EasyMock.createStrictControl();
easymock课程-mock的限制????????service?=?mocksControl.createMock(Service.class);
easymock课程-mock的限制????????business.setService(service);
easymock课程-mock的限制????}
easymock课程-mock的限制
easymock课程-mock的限制????@Test
easymock课程-mock的限制easymock课程-mock的限制????public?void?testDefaultBehavior()?{
easymock课程-mock的限制????????business.execute();
easymock课程-mock的限制????}
easymock课程-mock的限制
easymock课程-mock的限制????@Test
easymock课程-mock的限制easymock课程-mock的限制????public?void?testCustomizedBehavior()?{
easymock课程-mock的限制
easymock课程-mock的限制????????EasyMock.expect(service.toString()).andReturn("Customized?toString");
easymock课程-mock的限制????????EasyMock.expect(service.hashCode()).andReturn(100000);
easymock课程-mock的限制????????mocksControl.replay();
easymock课程-mock的限制
easymock课程-mock的限制????????business.execute();
easymock课程-mock的限制????????mocksControl.verify();
easymock课程-mock的限制????}
easymock课程-mock的限制}

??? 测试案例testDefaultBehavior()将为我们打印出mock对象默认的行为,输出如下:

service.toString() = EasyMock for interface net.sourcesky.study.easymock.tutorial.LimitationTest$Service
service.hashCode() = 26208195

?

??? 可见easymock内部已经做好了toString()和hashCode()实现。

?

??? 在测试案例testCustomizedBehavior()中,我们试图通过EasyMock.expect()来指定toString()和hashCode()的行为,但是运行时遭遇错误:

?

??? java.lang.IllegalStateException: no last call on a mock available
?at org.easymock.EasyMock.getControlForLastCall(EasyMock.java:521)
?at org.easymock.EasyMock.expect(EasyMock.java:499)
?at net.sourcesky.study.easymock.tutorial.LimitationTest.testCustomizedBehavior(LimitationTest.java:51)
?...

?

??? 从"no last call on a mock available"的描述上看,easymock根本没有把对toString()方法的调用记录(record)下来作为一个对mock对象的调用。

?

??? 因此,在使用mock对象时,请注意equals(), hashCode()和toString()三个方法无法更改其行为。

?

(2) class mock的限制

?

??? 相对于interface mock,class mock下easymock限制更多,除了上面谈到的equals(), hashCode()和toString()三个方法外,还有以下限制:

??? 1. final 方法不能被mock
??? 2. private 方法不能对mock

?

(3) 静态方法

??? 对于静态方法,easymock也无法mock其行为。

?

??? 由于这个限制,当被测试类中有静态方法调用时,典型如单例方法调用,lookup方式的依赖查找,easymock就会力不从心。从这个角度上,推荐尽量使用IOC 控制反转/ DI依赖注入的方式来实现依赖的获取,而不要使用lookup的主动查找方式。

?

??? 实际开发中,当发现有因为静态方法的限制从而导致easymock无法mock我们期望的行为,造成测试案例"不好写",“写不下去”时,请换个角度思考:为什么要用静态方法?可不可以改成注入?

?

(4) 解决的方法

?

??? 如果由于某些原因必须使用静态方法或者定制final, private方法的行为,则可以考虑搭配其他mock框架来完成功能。

?

??? 以静态方法方法为例,一个典型的使用范例是:使用jmockit来定制静态方法的行为,指定其返回easymock创建的mock对象,然后使用easymock的标准方式定制这个mock对象的行为。

?

热点排行