【问题标题】:Injecting test module with dagger2使用 dagger2 注入测试模块
【发布时间】:2015-05-29 08:40:17
【问题描述】:

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

【问题讨论】:

  • 作为初始评论,模块覆盖不是 dagger 2 中的东西。该方法存在以便在人们迁移时不会破坏编译,但已弃用并且对 dagger 2 项目没有影响.

标签: android unit-testing junit dagger-2


【解决方案1】:

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

这也是一本好书:http://engineering.circle.com/instrumentation-testing-with-dagger-mockito-and-espresso/

【讨论】:

  • 我更喜欢有两个单独的模块,所以 circle.com 博客文章不是我想要的(因为我不想在我的发布应用程序中有模拟依赖项)。构建变体方法听起来更好,但仍然不完美......
【解决方案2】:

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

当前由样板处理的依赖项如下:

  • 数据库依赖:封装了所有的数据库操作。
  • 共享偏好依赖:处理共享偏好。
  • 本地文件依赖:处理保存文件。
  • 分析依赖性:涵盖向分析后端(GA、Segment、FB、Flurry ..)报告事件的所有操作
  • 日志依赖:封装所有与日志相关的操作到你的控制台
  • API依赖:封装了所有API相关操作

依赖注入的强大功能非常方便,尤其是在测试方面,因为您可以轻松地将测试环境中的依赖切换为虚拟依赖。

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多