1

我知道this这个问题,但它涉及更笼统的话题。喜欢依赖注入部分模拟?

我是否更喜欢使用部分模仿而不是依赖注入?我的问题是基于以下引自OCMock:

id aMock = [OCMockObject partialMockForObject:anObject] 

创建可以以同样的方式作为anObject使用 模仿对象。当调用 未被桩位的方法时 它将被转发anObject。当使用对象的 引用调用 存根方法而不是 模拟时,它仍将由 模拟处理。

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

回答

3

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

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

但是,我会因为其他一些原因而出现这种情况。

  • 即使您可以重写依赖关系,默认情况下可能会拖入对“真实”的引用,目标压缩会创建比您想要的更紧密的耦合。
  • 如果您忘记提取并覆盖,则使用默认依赖关系,而您可能不需要该依赖关系。有时候最好明确一下预期用法。
+0

+1 - 根据最适合您代码的选项选择嘲笑或DI。而不是相反。 – 2009-10-13 11:54:16