I am using Dagger2 in my android application. Basically I embed an HttpClient (interface) in 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); } }
It is still so good that it works as expected. Now I want to write some unit tests (not hardware tests for Android) for MainActivity , where I want to use TestMainActivityModule instead of MainActivityModule .
@Module (overrides = true ) public class TestMainActivtiyModule extends MainActivityModule { @Provides public HttpClient(){ return new MockHttpClient(); } }
My question is: How to get MainActivity use TestMainActivitiyModule instead of MainActivityModule ? Is there a good solution for this?
My current approach is to use inheritance and override getModule() , something like this
public class TestMainActivity extend MainActivity { @Override protected void injectDependencies(){ Dagger_MainActivityComponent .builder() .mainActivityComponent( new TestMainActivtiyModule()) .build() .injectActivity(this); } }
and run unit test instead of TestMainActivity instead of MainActivity .
I think this works, but one of the problems I encounter with this approach is that I cannot run TestMainActivity with Intent , because I cannot specify it in AndroidManifest.xml
Does anyone know a better approach for unit testing with dagger2 on Android?
source share