什么时候应该删除模拟?

时间:2015-02-18 10:22:27

标签: unit-testing

有时候,当依赖接口的实现不可用时,我在TDD(测试驱动开发)中使用了模拟。所以我嘲笑那些依赖项并测试了我的工作。

现在可以使用依赖项的实现。那么我应该删除模拟还是应该将它们转换为间谍或类似的?我认为集成测试只能在删除那些模拟后完成,否则我可能需要复制它们。我有点困惑,对此有何建议?

2 个答案:

答案 0 :(得分:1)

一如既往:这取决于。

如果您正在使用模拟,那么您正在针对已定义的接口进行测试,因此您的单元测试更加集中,并且测试中的更改可能会更少(例如,当内部需要重构时)。

如果您正在使用实际依赖项,那么您的单元测试不是那么集中(它们可能是集成测试)。因此,这些测试通常更慢,更难以设置,并且在重构时更容易破坏。另一方面,由于您正在测试实际实现,因此您更有可能发现错误,因为实际实现的行为与您预期的不同。

答案 1 :(得分:1)

就单元测试而言 - 从不。通常是因为您希望保持单元测试的隔离:

  • 您的单元测试(就像任何其他类一样)通常应该有单一的理由来更改/中断。当发生错误时,您希望将可能的违法者数量减少到绝对最小值。单元测试失败是因为某些依赖可能失败,或者某些其他依赖可能失败,或者最终实际测试的类可能失败是不可取的。

实际上,这是一个很大的问题,因为即使更改依赖关系的接口也会导致使用此依赖关系更改类的单元测试。您想要避免的是某些人来自某些其他团队更改您正在使用的某些依赖的实现,因此您的测试会中断,显然没有任何理由。这又是非常不受欢迎的。

应使用模拟来隔离您的单位。当然,在编写不同类型的测试(比如集成)时,您不需要隔离。您希望真正的组件协作在一起。这是使用实际实现而不是模拟的原因之一 - 但是! - 这不会使您的单元测试失效。他们应该保持孤立。