【问题标题】:Mocking dependency not listed in module模块中未列出的模拟依赖项
【发布时间】:2019-09-07 20:43:19
【问题描述】:

我正在使用非常简单且可能非常常见的场景。这是我的示例依赖项:

public class MyDependency {
   @Inject
   public MyDependency(...) {
      ...
   }
}

我没有在任何模块中列出以上内容(也就是说,MyDependency 没有@Provides)。

我的示例用例如下所示:

public class ThePresenter {
   @Inject
   MyDependency myDependency;

   public ThePresenter() {
      App.getInstance().getAppComponent().inject(this);
   }
}

现在我想在单元测试中模拟我的依赖关系。我不想使用模块覆盖(这意味着我必须为所有标有@Inject 构造函数的依赖项添加@Provides)、测试组件等。除了标准和简单的问题,还有其他替代方法吗?

【问题讨论】:

    标签: android mockito dagger-2


    【解决方案1】:

    您需要使用构造函数注入,而不是在 Presenter 类构造函数中使用注入站点。通过在构造函数上添加 @Inject 注释将您的 Presenter 暴露给 dagger2(就像您对依赖项所做的那样):

    public class ThePresenter {
    
       private final MyDependency myDependency;
    
       @Inject public ThePresenter(MyDependency myDependency) {
          this.myDependency = myDependency;
       }
    }
    

    这允许反转控制并提供依赖/模拟。

    用法:

    public class ThePresenterTest {
    
       @Mock private MyDependency myDependency;
    
       private ThePresenter presenter;
    
       @Before public void setup() {
          MocktioAnnotations.initMocks(this);
          presenter = new ThePresenter(myDependency);
    
          Mockito.when(myDependency.someMethod()).thenReturn(someValue);
          ....
       }
    }
    

    【讨论】:

    • 严格来说,这并不能解决我的问题,因为演示者是由框架github.com/konmik/nucleus 实例化的,因此我无法进行正常的构造函数注入,但如果不采用框架部分,imo 你提出的建议是唯一可行的解​​决方案考虑到。我认为 Dagger 在一些极端情况下被夸大了!
    • 好吧,我不明白你在使用库。至于 dagger,如果您完全控制依赖关系图以及如何提供依赖关系,生活会变得更轻松。至于 dagger 被夸大了,一旦你需要作用域的依赖或者你的项目变得很大,那么 dagger 的好处就会变得更加明显。通常小型项目不使用依赖注入库。
    【解决方案2】:

    只是嘲笑它?

    public class ThePresenterTest {
    
       @Mock MyDependency myDependency;
    
       private ThePresenter presenter;
    
       @Before
       public void setup() {
          initMocks(this);
          presenter = new ThePresenter();
       }
    }
    

    【讨论】:

    • 以上不会模拟 ThePresenter 实体的字段,而是模拟 ThePresenterTest 的字段。
    • 不明白
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多