Dependency injection 更喜欢依赖注入而不是部分模拟?
我知道这是一个问题,但它涉及到更一般的问题 我应该更喜欢使用部分模拟而不是依赖注入吗?我的问题基于OCMock的以下引述:Dependency injection 更喜欢依赖注入而不是部分模拟?,dependency-injection,inversion-of-control,ocmock,partial-mocks,Dependency Injection,Inversion Of Control,Ocmock,Partial Mocks,我知道这是一个问题,但它涉及到更一般的问题 我应该更喜欢使用部分模拟而不是依赖注入吗?我的问题基于OCMock的以下引述: id aMock = [OCMockObject partialMockForObject:anObject] 创建可以使用的模拟对象 以与对象相同的方式。当 调用未存根的方法 它将被转发给一个对象。当 stubbed方法是使用 引用一个对象,而不是 mock,它仍将由 嘲弄 这意味着我可以使用部分模拟而不是将我的(属性)依赖项注入构造函数(或通过setter注入)来存根
id aMock = [OCMockObject partialMockForObject:anObject]
创建可以使用的模拟对象
以与对象相同的方式。当
调用未存根的方法
它将被转发给一个对象。当
stubbed方法是使用
引用一个对象,而不是
mock,它仍将由
嘲弄
这意味着我可以使用部分模拟而不是将我的(属性)依赖项注入构造函数(或通过setter注入)来存根掉。您应该设计您的API,使其作为通用API有意义,而不是特别支持单元测试或动态模拟 您建议的模式只是设计模式的一个变体,只是方法是一个属性。如果您认为,一般来说,将依赖项访问实现为虚拟属性是有意义的,那么您可以使用您描述的技术。这是一种众所周知的单元测试技术,称为提取和覆盖 然而,出于其他一些原因,我不愿意这样做
- 即使您可以覆盖依赖项,默认值也可能会将引用拖入到“真实”的预期深度,从而创建比您可能希望的更紧密的耦合
- 如果忘记提取和重写,将使用默认依赖项,您可能不希望这样做。有时,最好明确说明预期用途