mercredi 25 mars 2015

Injecting test module with dagger2

I use Dagger2 in my android app. Basically I inject a 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();

Dagger_MainActivityComponent
.builder()
.mainActivityComponent(getModule())
.build()
.injectActivity(this);
}


protected MainActivityModule getModule(){
return new MainActivityModule();
}

}


So far so good, that works like expected. Now I want to write some unit tests 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 do I force MainActivity to use TestMainActivitiyModule instead of MainActivityModule? Is there a good solution for that?


My current approach is to use inheritance and to override getModule(), something like this



public class TestMainActivity extend MainActivity {

@Override
protected MainActivityModule getModule(){
return new TestMainActivityModule();
}
}


and to run unit test against TestMainActivity instead of MainActivity.


I guess it works, but one of the problems I'm facing with this approach is that I can't start TestMainActivity with an Intent because I can't specify it in AndroidManifest.xml


Does anyone know a better approach for unit testing with dagger2 on android?


Aucun commentaire:

Enregistrer un commentaire