用dagger2注入测试模块

soc*_*qwe 5 junit android unit-testing dagger-2

我在我的Android应用程序中使用Dagger2.基本上我注入了一个HttpClient(接口)MainActivity.

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

}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,效果如预期.现在我想写一些单元测试(不是android仪器测试),而不是MainActivity我想要使​​用TestMainActivityModule的地方MainActivityModule.

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

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

}
Run Code Online (Sandbox Code Playgroud)

我的问题是:我如何强制MainActivity使用TestMainActivitiyModule而不是MainActivityModule?那有一个很好的解决方案吗?

我目前的方法是使用继承并覆盖getModule(),像这样

public class TestMainActivity extend MainActivity {

   @Override
   protected void injectDependencies(){

      Dagger_MainActivityComponent
        .builder()
        .mainActivityComponent( new TestMainActivtiyModule())
        .build()
        .injectActivity(this);
   }
}
Run Code Online (Sandbox Code Playgroud)

TestMainActivity不是运行单元测试MainActivity.

我想这很有效,但我遇到的问题之一就是我不能从TestMainActivity一开始就Intent因为我无法在AndroidManifest.xml

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

Pat*_*ick 0

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

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

  • 我更喜欢有两个独立的模块,因此 Circle.com 博客文章不是我想要的(因为我不想在我的发布应用程序中存在模拟依赖项)。构建变体方法听起来更好,但仍然不完美...... (2认同)