Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 更喜欢依赖注入而不是部分模拟?_Dependency Injection_Inversion Of Control_Ocmock_Partial Mocks - Fatal编程技术网

Dependency injection 更喜欢依赖注入而不是部分模拟?

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注入)来存根

我知道这是一个问题,但它涉及到更一般的问题

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

id aMock = [OCMockObject partialMockForObject:anObject]
创建可以使用的模拟对象 以与对象相同的方式。当 调用未存根的方法 它将被转发给一个对象。当 stubbed方法是使用 引用一个对象,而不是 mock,它仍将由 嘲弄


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

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

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

然而,出于其他一些原因,我不愿意这样做

  • 即使您可以覆盖依赖项,默认值也可能会将引用拖入到“真实”的预期深度,从而创建比您可能希望的更紧密的耦合
  • 如果忘记提取和重写,将使用默认依赖项,您可能不希望这样做。有时,最好明确说明预期用途

+1-根据最适合您的代码的内容选择模拟或DI。而不是相反。