在TDD(测试驱动开发)中,有时候当依赖接口的实现不可用时,我会使用模拟对象。因此,我模拟这些依赖并测试我的工作。
现在,这些依赖的实现是可用的。那么我应该删除模拟对象还是将它们转换为spy或类似的东西?我认为只有在删除这些模拟对象之后才能进行集成测试,否则我可能需要复制它们。我有点困惑,请给出任何建议。
在TDD(测试驱动开发)中,有时候当依赖接口的实现不可用时,我会使用模拟对象。因此,我模拟这些依赖并测试我的工作。
现在,这些依赖的实现是可用的。那么我应该删除模拟对象还是将它们转换为spy或类似的东西?我认为只有在删除这些模拟对象之后才能进行集成测试,否则我可能需要复制它们。我有点困惑,请给出任何建议。
事实上,这相当困难,因为即使更改依赖项的接口也会导致使用该依赖项的类的单元测试发生变化。然而,你要避免的是,某个人从其他团队更改了你正在使用的某个依赖项的实现,结果你的测试失败,显然毫无原因。这同样是高度不可取的。
模拟对象应该用来隔离你的单元。当编写不同类型的测试(比如集成测试)时,你不需要隔离。你需要真正的组件协作。这是使用实际实现而不是模拟对象的原因之一——但是!——这并不否定你的单元测试。它们应该保持独立。
像往常一样:这取决于具体情况。
如果您使用了模拟数据,则在测试期间您将会针对已定义的接口进行测试,因此您的单元测试更加专注,并且在进行内部重构时减少了出现断裂的可能性。
如果您使用实际依赖项,则您的单元测试不够专注(它们可能是集成测试)。因此,这些测试通常速度较慢、设置更加困难,并且在进行重构时更容易出现问题。另一方面,由于您正在针对实际实现进行测试,所以您更有可能发现由于实际实现行为与您预期不同而导致的错误。