Próbuję wstrzyknąć usługę TelephonyManager
za pomocą Sztyletu. Śledzę to sample. Rozszerzyłem klasę Application
, aby utworzyć wykres i zdefiniowałem , w którym znajduje się , a inne moduły zostaną uwzględnione w przyszłości.Inject service with Dagger and Robolectric
Edit:
Teraz usługa systemowa jest wstrzykiwany na Activity
bez żadnych problemów. Brakowało mi FinderApplication.inject(this)
wewnątrz Activity
. Ma zastrzyk, ale nadal nie wstrzykuje się w testach z Robolectric
. Dodałem przypadek testowy na dole tego postu:
Edit-2: ApplicationModule
usunięte i stworzył BaseActivity
z:
((FinderApplication) getApplication()).getGraph().inject(this);
na onCreate
metody. Błąd Dostaję jest:
Spowodowany przez: java.lang.NoSuchMethodException. ServiceModule()
Ale jeśli określić pusty konstruktor uzyskać zerowy wskaźnik, gdy klasa jest wtryskiwana potrzebne.
FinderApplication.java
public class FinderApplication extends Application {
private ObjectGraph mObjectGraph;
@Override
public final void onCreate() {
super.onCreate();
mObjectGraph = ObjectGraph.create(new ServiceModule(this));
}
public final ObjectGraph getGraph() {
return mObjectGraph;
}
}
ServiceModule.java
@Module(entryPoints = { SimCardActivity.class, SimService.class })
public class ServiceModule {
private Context mContext;
public ServiceModule(Context context) {
mContext = context;
}
@Provides @Singleton
TelephonyManager provideTelephonyManager(){
return (TelephonyManager) mContext
.getSystemService(Context.TELEPHONY_SERVICE);
}
}
SimCardActivityTest.java
@RunWith(RobolectricTestRunner.class)
public class SimCardActivityTest {
@Before
public void setUp() throws Exception {
ObjectGraph.create(new TestModule()).inject(this);;
}
@Module(
includes = ServiceModule.class,
overrides = true,
entryPoints = {SimCardActivityTest.class, SimCardActivity.class}
)
static class TestModule{
public static TelephonyManager TELEPHONY_MANAGER =
Mockito.mock(TelephonyManager.class);
@Provides @Singleton
TelephonyManager provideTelephonyManager(){
return TELEPHONY_MANAGER;
}
}
}
Nie sądzę includes flagą w @Module adnotacji zapewni członkom innych modułów. "obejmuje" oznacza użycie innego modułu, aby upewnić się, że wszystkie elementy do wstrzykiwania w każdym punkcie wejścia są spełnione, tak że moduł tworzy kompletny wykres obiektów. – SeanPONeil
Wygląda na to, że flaga zawiera rzeczywiście określone moduły. Ponieważ jest wstrzykiwany, gdy aplikacja działa normalnie. – Axxiss
Wstrzykujesz przypadek testowy do grafu obiektu zamiast do aktywności? – SeanPONeil