模块中未列出的模拟依赖项

Mocking dependency not listed in module

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

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

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

我的示例用例是这样的:

public class ThePresenter {
   @Inject
   MyDependency myDependency;

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

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

只是模拟一下?

public class ThePresenterTest {

   @Mock MyDependency myDependency;

   private ThePresenter presenter;

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

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

public class ThePresenter {

   private final MyDependency myDependency;

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

然后允许反转控制并提供 dependency/mock。

用法:

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);
      ....
   }
}