模拟对象(mock object)
目录 |
在面向对象程序设计中,模拟对象也译作模仿对象。是以可控的方式模拟真实对象行为的假的对象。程序员通常创造模拟对象来测试其他对象的行为,很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为。
在单元测试中,模拟对象可以模拟复杂的、真实的(非模拟)对象的行为, 如果真实的对象无法放入单元测试中,使用模拟对象就很有帮助。
在下面的情形,可能需要使用模拟对象来代替真实对象:
例如,一个可能会在特定的时间响铃的闹钟程序可能需要外部世界的当前时间。要测试这一点,测试一直要等到闹铃时间才知道闹钟程序是否正确地响铃。如果使用一个模拟对象替代真实的对象,可以变成提供一个闹铃时间(不管是否实际时间),这样就可以隔离地测试闹钟程序。
模拟对象的使用可能会将单元测试与被测代码的实现耦合得很紧。例如,许多模拟对象框架允许开发人员指定模拟对象上方法被调用的次序和调用的次数,这样,测试通过后对代码进行重构,即使方法依然遵守以前实现的契约,也可能会造成测试失败。这说明单元测试应当测试方法的外部行为,而非其内部实现。在单元测试测试用例中过度使用模拟对象可能导致随着系统的发展,不断进行的重构会造成维护测试本身的工作量出现显著的增长。在发展过程中,这种测试的不正确地维护可能会漏报错误,而在使用真实对象进行的测试中会捕捉到。相反,与设置好整个真实对象相比,简单地模拟一个方法可能需要更少的配置,因此减少了需要的维护工作。
模拟对象必须要准确地建模它们要模拟的对象的行为,然而,如果要模拟的对象来自另一个开发人员或项目,或者如果还没有开发出来,准确的建模是很难做到。如果没有正确建模行为,那么可能会单元测试记录通过,而真正运行时,在同样条件下可能会造成测试失败。