繁体   English   中英

用dagger2注入测试模块

[英]Injecting test module with dagger2

我在我的Android应用程序中使用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进行单元测试的更好方法?

我开始使用的方法涉及在并行构建变体(例如: appintegration )中维护两个模块(一个用于app,一个用于测试)。 仍然不确定该解决方案如何很好地扩展YMMV。 我很高兴看到更好的解决方案!

这也很棒: http//engineering.circle.com/instrumentation-testing-with-dagger-mockito-and-espresso/

我真的建议你检查这个样板,因为它完全基于使用Dagger2的DI。 它还展示了如何以非常简洁的方式替换测试环境中的依赖项。

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

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

依赖注入的强大功能非常方便,特别是对于测试,因为您可以轻松地将测试环境中的依赖项切换为虚拟依赖项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM