Ich versuche, den Dienst TelephonyManager
mit Dolch zu injizieren. Ich folge diesem sample. Ich erweiterte die Application
Klasse, um das Diagramm zu erstellen, und definierte ein ApplicationModule
, wobei ServiceModule
enthalten ist und andere Module in der Zukunft enthalten sein werden.Inject Service mit Dolch und Robolectric
Edit:
Nun ist der Systemdienst auf einer Activity
ohne Probleme eingespritzt wird. Ich habe FinderApplication.inject(this)
innerhalb der Activity
vermisst. Es hat eine Injektion aber injiziert immer noch nicht unter Test mit Robolectric
. Ich habe den Testfall am Ende dieses Beitrags:
Bearbeiten-2: ApplicationModule
gelöscht und BaseActivity
mit erstellt:
((FinderApplication) getApplication()).getGraph().inject(this);
auf onCreate
Methode. Der Fehler Ich erhalte ist:
Verursacht durch: java.lang.NoSuchMethodException. ServiceModule()
Aber wenn ich einen leeren Konstruktor definieren erhalte ich einen Null-Zeiger, wenn die injizierte Klasse erforderlich.
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;
}
}
}
Ich glaube nicht, das Kennzeichen in der @Module Anmerkung enthält, werden zu Mitgliedern für andere Module bereitstellen. "Einschließen" bedeutet, dass ein anderes Modul verwendet wird, um sicherzustellen, dass alle injizierbaren Elemente in jedem Eingangspunkt erfüllt sind, sodass das Modul ein vollständiges Objektdiagramm erstellt. – SeanPONeil
Es scheint, als würde das Flag includes die angegebenen Module enthalten. Da wird injiziert, wenn die App normal läuft. – Axxiss
Sie injizieren den Testfall möglicherweise in das Objektdiagramm anstatt in die Aktivität? – SeanPONeil