Cedric Beust(译注1)在最近的一篇blog中提到:
“使用Mock Object(译注2)能给你的是虚假的满足感,所以你应该避免使用它们,除非迫不得已。”
使用Mock Object的动机是确保所模仿的对象能够被正确的使用,这与确保系统在整体上能够正常地工作是两码事。实际上,这是单元测试和验收测试之间必要的不同之处。
单元测试只测试一个单元(唏嘘之声~)。一个优秀的单元测试只测试本单元的分内之事。这是单纯为了信息的隐藏和封装,不管你还有什么分外之想。当我们测试一个单元的时候,我们希望这个单元与系统其它部分隔开,这样它就不会在测试中被妨碍。我们只想测试这个单元,除了这整个单元,别无其它。
验收性测试就不仅是用来测试一个单元了,一般来说,它要测试整个系统,而更普遍的情况下,它是测试系统的一个子集。有的验收测试会测试数据库或是GUI之外的业务逻辑;有的则会测试数据管理层,或是GUI层。还有些会测试整个系统(我们通常称之为集成测试)。
Mock Object是用于单元测试和某些验收性测试的工具。它们不是用来带给你“虚假的满足感”的,因为当你用它们的时候你清楚这可不是要测试整个系统;当你使用Mock Object的时候,你清楚除此之外还有其它很多测试要做。所以,我认为Cedric的观点不大恰当。
正相反,如果缺少Mock Object反而会带来虚假的满足感。如果你的集成测试已经跑通了,你可能就会觉得所有单元测试也一定能跑通。这种想法不难理解,因为整个系统是由一个个的单元所构成的。然而,单元测试可能会在集成测试无法发现的某些情形下出现问题。资源泄露可能就不会在集成测试中暴露出来(例如,某单元不能确保可靠的掉用了"close"方法),可产品运行时就完蛋了。像这种bug可是单元测试的强项,因此我们是需要Mock Object的。
译注:
1,Cedric Beust,是WebLogic Server团队的高级软件开发人员,他在其博客Otaku中提出了J2EE、Java、AOP和软件开发等方面的见解,此外,Cedric更是敏捷技术的活跃分子。
2,Mock Object,中文一般翻作模仿对象,更一般场景是直接称之为Mock,本文即直接引用。软件系统一般需要大部分组件进行复杂的相互协同来完成工作,但单元测试的重点并不在这些协同上,它可以去假设这些协同是正确的。而Mock Object就是在此时被使用的中介对象,用于模仿所协同对象在断言正确时的行为。
(原文链接网址:http://www.butunclebob.com/ArticleS.UncleBob.TheDangerOfMockObjects; Robert C. Martin的英文blog网址:http://www.butunclebob.com/ArticleS.UncleBob)
作者简介:Robert C. Martin是Object Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。
分享到:
相关推荐
info: { name: 'Mock API', description: 'Mock API for vue-typescript-admin-template.', version: '1.0.0'},paths: { get: [ '/mock-api/v1/articles', '/mock-api/v1/articles/:id', '/mock-api/
Spring针对J2EE的常用Web接口提供了Mock,这些组件被发布于spring-mock.jar,介绍如下: MockHttpServletRequest:HttpServletRequest接口的mock实现。 MockHttpServletResponse:HttpServletResponse接口的mock...
restful api client,体验类似 postman,免费文档功能,mock功能等等。 描述: 版本3.0.3,稳定版本。 apizza.cc极客专属的api协作管理工具。 免费的团队协作,在线模拟调试,快速生成api文档,导出离线版文档。 ...
restful api client,体验类似 postman,免费文档功能,mock功能等等。2.0版本,修复js报错Bug,更新LOGO。 描述: Apizzaisabrowserplug-infortestingRESTfulwebservices,likepostman。 apizza.cc极客专属的api...
mock-api 原理 基于 OkHttp 的 Interceptor :如果目标url需要mock,则从本地(assets或sdcard)读取数据,否则继续向外发送请求。 使用 首先,在 build.gradle 中添加以下依赖: compile '...
用户行为日志生成脚本
gmall2020-mock-db-2021-11-14.jar
名称Web::API::Mock - 这是新的 $module概要 $ git clone git@github.com:takihito/Web-API-Mock.git $ cpanm ./Web-API-Mockor$ cpanm Web::API::Mock:$ run-api-mock --helpUsage: $ run-api-mock --files api.md ...
不错的文档,提供给科研人员
ts-mock-generator English | :sparkles: 特征 :package: 开箱即用的模拟生成工具 :face_with_tongue: 通过接口定义返回值接口自动生成模拟数据 :page_facing_up: 支持生成模拟文件以进行二次编辑 :fire: 支持...
此资源仅是为了配合iView-Admin正常运行而创建的Express服务端,取代了iView-Admin中原有Mock,便于和我一样的菜鸟观察iView-Admin与服务器之间的按口。 使用方法为:首先要有Express环境。下载此压缩包后先解压,...
您只需调用一个函数即可更新当前应用于文档的媒体查询。 安装 NPM npm i --save-dev jest-matchmedia-mock 纱 yarn add --dev jest-matchmedia-mock 用法 import MatchMediaMock from 'jest-matchmedia-mock' ; ...
:light_bulb: 安装及使用需要 首先,使用安装软件包: composer require --dev nunomaduro/mock-final-classes 而已! 现在,您可以模拟最终方法和类。 :male_sign::male_sign: :exploding_head: 怎么运行的? ...
xe-ajax-mock基于 xe-ajax 的 Mock 虚拟服务Browser Support9+ :check_mark:Latest :check_mark:Latest :check_mark:Latest :check_mark:Latest :check_mark:8+ :check_mark:Installingnpm install xe-ajax xe-ajax-...
gmall-mock-db-2020-03-16-SNAPSHOT.jar
Vue路由器模拟 在您的Vue 3应用中轻松模拟路由交互 :warning: 该库旨在与编写测试的人员合作,以创造更好的体验,以编写涉及将路由与Vue结合使用的测试。 在问题和讨论中欢迎您的反馈和经验丰富的人员来提出API形状...
spring测试框架
有兴趣帮助维持react-native-mock吗? React本机模拟 一个完全模拟且易于测试的react native版本 要求 Node.js 4+ 最新版本的react-native 注意:该库旨在与最新版本的react-native一起使用。 如果您使用的不是...
单元测试高级特性--mock模拟网络请求单元测试高级特性--mock模拟网络请求单元测试高级特性--mock模拟网络请求单元测试高级特性--mock模拟网络请求单元测试高级特性--mock模拟网络请求单元测试高级特性--mock模拟网络...