5

我在我的 android 应用程序中使用 Dagger2。基本上我HttpClientMainActivity.

@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

我想它有效,但我在使用这种方法时面临的一个问题是我不能从TestMainActivityan 开始,Intent因为我无法在AndroidManifest.xml

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

4

2 回答 2

0

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

这也是一个很好的阅读:http ://engineering.circle.com/instrumentation-testing-with-dagger-mockito-and-espresso/

于 2015-03-26T11:12:51.027 回答
0

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

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

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

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

于 2016-11-23T10:22:50.327 回答