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