关于单元测试:假对象与模拟对象

Fake objects vs Mock objects

在TDD中有两个概念:虚假对象和模拟对象。 如果要测试的类与其他类或对象或数据库交互,则使用这两个概念...

我的问题是:两者有什么区别? 我什么时候可以使用它们中的每一个?

编辑:
我找到了这个答案:
假装,嘲弄和捣蛋有什么区别?

但我仍然对两者之间的区别感到困惑:
他们都创建了组件的实现,并为Fake实现了轻量级。 但是,如果是假的话,"快捷方式"的"轻量级实施"是什么意思?
Mock对象的工作方式与真实对象的工作方式有何区别?


例如,DataSet的虚假实现只会返回一组静态数据。模拟几乎是一个完整的实现,可以根据输入生成各种数据集。如果你正在嘲笑你的数据层,你将能够针对模拟执行命令对象,并且它足够强大,可以使用"有效"语句返回数据,或者使用无效语句抛出异常。所有这些都没有实际连接到数据库或文件。

至于mock和real之间的区别,通常在模拟一个类时,你会创建一个工厂对象,默认情况下会返回真实对象,但是当你编写测试时,你可以告诉它返回一个特定的mock类。模拟类要么实现与真实对象相同的接口,要么使用模仿底层实际类的包装类,但允许关键部分的依赖注入生成数据而不进行外部调用。