模拟依赖未在模块中列出

时间:2019-09-07 20:43:19

标签: android mockito dagger-2

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

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

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

我的示例用例是这样的:

public class ThePresenter {
   @Inject
   MyDependency myDependency;

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

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

2 个答案:

答案 0 :(得分:0)

只是嘲笑它?

public class ThePresenterTest {

   @Mock MyDependency myDependency;

   private ThePresenter presenter;

   @Before
   public void setup() {
      initMocks(this);
      presenter = new ThePresenter();
   }
}

答案 1 :(得分:0)

您需要使用构造函数注入,而不是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);
      ....
   }
}