在“Ode To Code“网站上,K Scott Allen理性地分析了如何在单元测试中使用mock 对象,并分享了他针对mock 对象框架使用情况的想法。
首先,Allen 就人们对 mock 的常见误解,抛出了尖锐的意见:
我们知道,像与 SMTP 服务器通信的对象这样的资源,是很难在单元测试中使用的,有些人以为,只有在需要模拟出与这种资源之间的交互行为时,才用得上 mock 对象。他们是错的。
接下来,他引用了 Colin Mackay 讲述 mock 的论文,列出了一些常见的使用 mock 的场景: - 真实对象有着不确定的行为
- 真实对象很难创建
- 真实对象的行为很难触发
- 真实对象响应缓慢
- 真实对象是用户界面
- 真实对象使用了回调机制
- 真实对象尚未存在
然后 Allen 便道出了文章的主旨。他认为,即使是上面列表中的内容也稍显肤浅,从更深刻、更普遍的意义而言,应该是”在你想把被测试的代码分离的时候, test doubles [mocks] 就显出了作用。“简而言之,按照 Allen 的观点,用了 mock 对象,业务组件的测试代码就可以不依赖其它组件了;试举一例来看,A 依赖于 B,但 A 的单元测试只会因为 A 的问题而出现问题,跟 B 的状态无干。 文章还讲到了在真正的测试驱动开发中, mock 对象所扮演的角色:
"模拟角色,而非对象"的作者们写到,mock 技术: “……在基于对象角色构建的系统中,可以识别出各种角色类型……尤其是,我们已经知道了 Mock Object 可以为我们带来的最大好处——曾被称为接口识别的概念”。
在文章的最后,Allen 评价了一些 mock 对象框架,包括 JMock 、 EasyMock 、 NUnit 。他坚持认为,虽然这些框架很简单,但是想用得得心应手,还得花些心思。 在 TDD yahoo 讨论组上,也发起了精彩的讨论,值得一读。
查看英文原文: When To Use Mock Objects
评论