最近忙得一直没有打理我的Blog。趁这两天有点时间,就写点单元测试的东西吧!一般的东西网上都很多了,我就来谈谈模拟对象在单元测试中的作用吧!
现在TDD已经开始被大多数人接受,即使你没有完全采用这种开发方法,但至少你会采用单元测试的吧。
我们知道单元测试的基本要求就是保证每个测试的环境是独立的,同时要求测试的速度尽量的快速。一般这都是很容易满足的,但是在下面的一些情况下,就有些矛盾出现了:当我们的程序中有随机数时,当我们要对数据库测试时,当我们需要测试GUI时……那么这时我们应该怎么办呢?采用模拟对象(Mock)。它可以帮助我们产生可控的和轻量级的对象。
当然你可以自己实现模拟对象,但是当你写过几个这样的程序后,你就会觉得索然无味,为什么呢?因为它们的基本结构都是一样的。当初发明模拟对象的那帮人也发现了这点,所以他们最后就写了一个框架(MockObject),继承它,你就可以只关注于实际的业务逻辑而不用在那些的呆板的框架上费事了;但这样实现的模拟对象仍然需要很大的手工量,后来那帮人就索性好人做到底,又发布了一个MockMaker,借助它,你只需要提供一接口或者类,它就可以自动帮你生成你所需要的模拟对象,而且它的操作还有Swing界面,很是省事^_^!
也许你觉得这样就很好了,但这样却出现了一个问题:我们在代码中需要额外的多管理几个类!也许你觉得这没有什么,但是当你的程序很大时就很有可能在修改某些代码后出现同步问题。那怎么办呢?牺牲部分灵活性,采用动态生成的办法——easymock。
easymock的想法很简单,我不用额外生成一个类,只要你给我一个接口,我在测试时借助这个接口在内存中动态生成一个模拟对象,这样既保证了你的需要,又不会增加你的额外管理的负担!当然我在前面已经说了,这样做是有代价的(除了性能有些影响之外):easymock产生的模拟对象是被动的,它只能接收数据然后进行验证!当然,在大多数情况下这不是问题!
好了,关于模拟对象的基本东西就介绍到这,下一篇中我将借助easymock来演示怎么对GUI进行测试 !
(上面提到的这三个框架你可以去SourceForge上下载)