Używam Dagger2 w mojej aplikacji na Androida. Zasadniczo wstrzykuję HttpClient
(interfejs) w MainActivity
.Wstrzykiwanie modułu testowego za pomocą sztyletu2
@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);
}
}
Jak dotąd tak dobrze, że działa tak, jak się spodziewano. Teraz chcę napisać kilka testów jednostkowych (nie androidowych testów instrumentacji) dla MainActivity
, gdzie chcę użyć TestMainActivityModule
zamiast MainActivityModule
.
@Module (overrides = true)
public class TestMainActivtiyModule extends MainActivityModule {
@Provides public HttpClient(){
return new MockHttpClient();
}
}
Moje pytanie brzmi: Jak mogę zmusić MainActivity
używać TestMainActivitiyModule
zamiast MainActivityModule
? Czy istnieje dobre rozwiązanie?
Moje obecne podejście jest użycie dziedziczenia i zastąpić getModule()
, coś jak ten
public class TestMainActivity extend MainActivity {
@Override
protected void injectDependencies(){
Dagger_MainActivityComponent
.builder()
.mainActivityComponent(new TestMainActivtiyModule())
.build()
.injectActivity(this);
}
}
i uruchamianie testów jednostkowych przed TestMainActivity
zamiast MainActivity
.
Myślę, że to działa, ale jeden z problemów stojących jestem z tego podejścia jest to, że nie można uruchomić TestMainActivity
z Intent
bo nie można określić go w AndroidManifest.xml
Czy ktoś wie lepiej podejście do testowania jednostkowego za pomocą sztyletu 2 na Androida?
Jako wstępny komentarz, nadpisanie modułów nie jest rzeczą w sztyletie 2.Metoda polega na tym, aby nie niszczyć kompilacji podczas migracji, ale jest przestarzała i nie ma wpływu na projekt sztyletu 2. –