使用dagger2注入测试模块

5

我在我的安卓应用中使用Dagger2。基本上,我在MainActivity中注入了一个HttpClient(接口)。

@Module
public class MainActivityModule{

   @Provides public HttpClient providesHttpComponent(){
        return new RealHttpClient();
    }
}

@Component( modules = MainActivityModule.class )
public interface MainActivityComponent {
   public MainActivity injectActivity(MainActivity);
}



public class MainActivity extends Activity {

   public void onCreate(Bundle saved){
      super.onCreate();

      injectDependencies();
   }


   protected void injectDependencies(){

      Dagger_MainActivityComponent
        .builder()
        .mainActivityComponent( new MainActivityModule())
        .build()
        .injectActivity(this);
   }

}

目前为止,一切都很好,这像预期的那样工作。现在我想为MainActivity编写一些单元测试(而不是Android仪器测试),并希望在其中使用TestMainActivityModule,而不是MainActivityModule

@Module (overrides = true )
public class TestMainActivtiyModule extends MainActivityModule {

   @Provides public HttpClient(){
      return new MockHttpClient();
   }

}

我的问题是: 如何强制MainActivity使用TestMainActivitiyModule而不是MainActivityModule?有一个好的解决方案吗?
我当前的方法是使用继承并重写getModule(),类似于以下内容。
public class TestMainActivity extend MainActivity {

   @Override
   protected void injectDependencies(){

      Dagger_MainActivityComponent
        .builder()
        .mainActivityComponent( new TestMainActivtiyModule())
        .build()
        .injectActivity(this);
   }
}

为了对TestMainActivity而非MainActivity运行单元测试。

我想这可行,但是我面临的问题之一是我无法使用Intent启动TestMainActivity,因为我不能在AndroidManifest.xml中指定它。

有没有人知道在android上使用dagger2进行单元测试的更好方法?


1
作为初始评论,Dagger 2 中没有模块覆盖这个概念。该方法存在是为了在人们进行迁移时不破坏编译,但已被弃用并不会对 Dagger 2 项目产生任何影响。 - Christian Gruber
2个回答

0
我开始使用的方法是同时维护两个模块(一个用于应用程序,一个用于测试),并且采用平行构建变体(例如:appintegration)。但仍不确定该解决方案的可扩展性如何,因此可能因人而异。如果有更好的解决方案,我会非常高兴看到它!
这也是一篇很棒的文章:http://engineering.circle.com/instrumentation-testing-with-dagger-mockito-and-espresso/

2
我更喜欢有两个独立的模块,因此 circle.com 的博客文章不符合我的要求(因为我不想在发布应用程序时具有假依赖)。构建变体方法听起来更好,但仍然不完美... - sockeqwe

0

我强烈建议您检查这个boilerplate,因为它完全基于使用Dagger2的DI。它还展示了如何以非常整洁的方式在测试环境中替换依赖项。

目前由锅炉板处理的依赖关系如下:

  • 数据库依赖项:封装所有数据库操作。
  • 共享首选项依赖项:处理共享首选项。
  • 本地文件依赖项:处理文件保存。
  • 分析依赖项:涵盖将事件报告给您的分析后端(GA、Segment、FB、Flurry等)的所有操作
  • 日志记录依赖项:封装与记录到控制台相关的所有操作
  • API依赖项:封装所有API相关操作

依赖注入的优势在于特别适用于测试,因为您可以轻松地在测试环境中切换依赖项以进行虚拟依赖项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接