5

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

}

これまでのところ、期待どおりに動作します。今、代わりにMainActivity使用したい場所のユニットテスト(アンドロイドインストルメンテーションテストではない)をいくつか書きたいと思います。TestMainActivityModuleMainActivityModule

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

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

}

私の質問は:の代わりに強制的MainActivityに使用するにはどうすればよいですか? そのための良い解決策はありますか?TestMainActivitiyModuleMainActivityModule

私の現在のアプローチは、継承を使用してオーバーライドするgetModule()ことです。

public class TestMainActivity extend MainActivity {

   @Override
   protected void injectDependencies(){

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

TestMainActivityの代わりに単体テストを実行しますMainActivity

うまくいくと思いますが、このアプローチで直面している問題の1つは、で指定できないため、から始めることができないことTestMainActivityですIntentAndroidManifest.xml

Androidでdagger2を使用した単体テストのより良いアプローチを知っている人はいますか?

4

2 に答える 2

0

私が使い始めたアプローチでは、2 つのモジュール (アプリ用とテスト用) を並列ビルド バリアント (例:appintegration) で維持する必要がありました。そのソリューションがYMMVにどれだけうまくスケーリングするかはまだわかりません。より良い解決策を見つけていただければ幸いです。

これも素晴らしい読み物です: http://engineering.circle.com/instrumentation-testing-with-dagger-mockito-and-espresso/

于 2015-03-26T11:12:51.027 に答える