最近在学习TDD,在测试驱动开发的时候常常会遇到测试的模块依赖到其他模块的时候,就会使用Mock对象,所以将自己最近学习的心得拿出来分享一下,有什么说的不对的地方,还希望大家跟我指出来!
想必大家都知道单元测试,是一个最小的对程序正确性检查的单位。在面向对象的开发中,往往我们是对一个方法进行测试,我们的测试目的是为了验证这个方法是否正确,也就是说如果这个方法错了,我希望的是一定是这个方法错了,而不是它所依赖的方法错了。如果整个单元测试跑下来,有10个错误,我们希望的是确实有10个方法错了。所以单元测试的独立性很重要,但是单元测试往往会依赖于其他方法,就算我们想尽一切办法解耦,为我们所依赖的方法抽象出一个接口,虽然此时方法依赖于抽象,但是我们必须还是要提供实现,这时如果我们能自己能提供一个正确的实现,确保待测的方法所依赖的是一个稳定正确的实现,那我们就能为测试消除一个影响测试正确性的干扰。不过这只是使用Mock对象的场景之一。
往往我们会在这些场景下使用Mock对象:
1.我们所依赖的对象很不稳定。(常常发生变化,那样我们的单元测试就变得很不稳定)
2.依赖的对象很难被创建 (也许这个对象还没有被其他小组的同事开发出来)
3.依赖的对象访问速度很慢(这里也许依赖对象要连接远程数据库,速度很慢。因为大家想必都知道,单元测试还有个基本的原则就是要快速执行,这里就明显违背了)
好了,前面我也提到,我们为所依赖的模块抽象出一个接口,是确实常用的办法。但是难道我们每次都需要自己建一个类,自己去实现这个接口吗?当然不是,有很多Mock对象框架,能帮我动态的创建一个实现。这里我将简单的介绍一个.NET平台下的Moq框架,我的重点是模仿Moq框架的API提供一个简易的实现,不过最重要的是给对Mock对象框架有兴趣的朋友一点思路。全文阅读