# 模拟对象 Mock objects ## 定义 在制作自动单元测试时通常使用的一种技术。它包括实例化软件组件(通常是类)的特定于测试的版本,它代替正常行为提供了预先计算的结果,并且通常还检查被测试对象是否按预期调用了该版本。 例如,数据库组件的“模拟”版本将a)提供对数据库查询的“固定”答案,而不是连接到实际的实时数据库,以及b)验证是否按照预期和规定的方式访问数据库。考试。 ## 也称为 为了测试的目的,组件中有许多模仿实际代码的术语:模拟,存根,假冒,间谍,虚拟人,以较常见的名字命名。 这些术语不是严格的同义词,各作者根据组件是否具有行为,记录与其他组件的交互等来在这些类别之间进行相对微妙的区分。 已经提出通用术语“ 测试双倍 ”来指代任何这样的组成部分(暗示“特技双倍”)。 ## 预期收益 模拟对象提供“去耦”软件组件以进行测试。例如,不应将依赖的代码“耦合”到该数据库的实现细节:其正确功能依赖于所查询数据的逻辑组织,而不是依赖于具体方面,例如将数据存储在磁盘上或通过网络建立连接协议。模拟对象导致的测试仅行使被测软件组件的行为,而不依赖于其他不相关组件的行为。 ## 常见陷阱 该技术有些争议,既有技巧也有缺点。后者认为过度使用模拟对象会导致较重的测试维护负担,并降低了测试作为文档的作用,并且这些缺点并不能始终通过模拟对象的好处得到充分补偿。 ## 起源 - 2000年:Freeman,McKinnon和Craig在他们的文章“ Endo-Testing:使用Mock Objects进行单元测试 ”中描述了“模拟对象”测试技术,这是对Lewis Carroll中“ Mock Turtle”角色的暗示。 - 2010:集成的模拟对象的全面描述,TDD和面向对象设计弗里曼和普赖斯的“提供通过测试的指导下成长的面向对象的软件 “ – 有关更多信息,请访问:http : //guide.agilealliance.org/guide/mocks#sthash.wmgV7PHD.dpuf