1

我知道这个SO question,但它以更笼统的方式处理该主题。

我应该更喜欢使用部分模拟而不是依赖注入吗?我的问题基于 OCMock 的以下引用:

id aMock = [OCMockObject partialMockForObject:anObject]

创建一个可以像 anObject 一样使用的模拟对象。当一个没有被存根的方法被调用时,它将被转发一个对象。当使用对 anObject 的引用而不是 mock 调用存根方法时,它仍将由 mock 处理。

这意味着我可以使用部分模拟而不是在构造函数中(或通过 setter 注入)注入我的(属性)依赖项。

4

1 回答 1

3

您应该设计您的 API,使其作为通用 API 有意义,而不是特别支持单元测试或动态模拟。

您建议的模式只是模板方法设计模式的一种变体,只是该方法是一个属性。如果您认为通常将依赖项访问实现为虚拟属性是有意义的,那么您可以使用您描述的技术。这是一种众所周知的单元测试技术,称为提取和覆盖

但是,出于许多其他原因,我会对此有所不同。

  • 即使您可以覆盖依赖项,默认值也可能会拖入对“真实”预期依赖项的引用,从而创建比您想要的更紧密的耦合。
  • 如果您忘记提取和覆盖,则使用默认依赖项,您可能不希望这样做。有时最好明确说明预期用途。
于 2009-10-13T11:48:48.477 回答