2013-03-06 9 views
6

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; 
     } 
    } 
} 
+0

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

+0

Es scheint, als würde das Flag includes die angegebenen Module enthalten. Da wird injiziert, wenn die App normal läuft. – Axxiss

+1

Sie injizieren den Testfall möglicherweise in das Objektdiagramm anstatt in die Aktivität? – SeanPONeil

Antwort

3

Wie @AndyDennie zu seinem Kommentar sagte, habe ich in der Testklasse keine Injektion gemacht. Das Problem wurde gelöst, indem die zu testende Aktivität injiziert wurde, anstatt sie auf setUp() zu erstellen.

Mein aktueller Testfall (relevante Code) sieht wie folgt aus:

@RunWith(RobolectricTestRunner.class) 
public class SimCardActivityTest { 

    @Inject 
    private SimCardActivity mActivity; 

    private TelephonyManager mTelephonyManager; 

    @Before 
    public void setUp() throws Exception { 
     ObjectGraph.create(new ServiceModule(Robolectric.application), 
          new ServiceTestModule()).inject(this); 
    } 

    @Module(
      includes = {ServiceModule.class }, 
      overrides = true, 
      entryPoints = {SimCardActivity.class, SimCardActivityTest.class} 
    ) 
    static class ServiceTestModule { 
     public static TelephonyManager TELEPHONY_MANAGER = 
      Mockito.mock(TelephonyManager.class); 

     @Provides 
     @Singleton 
     TelephonyManager provideTelephonyManager(){ 
      return TELEPHONY_MANAGER; 
     } 
    } 
} 
+0

Kleiner Kommentar: Ich glaube, wenn Sie den TelephonyManager mit @Singleton bereitstellen, müssen Sie keine statische Instanz (TELEPHONY_MANAGER) deklarieren und sie zurückgeben. Sie könnten Mockito.mock (TelephonyManager.class) in der Methode provides zurückgeben, da sie nur einmal ausgeführt wird. – GaRRaPeTa

Verwandte Themen