2013-03-06 13 views
6

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

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

+0

Wygląda na to, że flaga zawiera rzeczywiście określone moduły. Ponieważ jest wstrzykiwany, gdy aplikacja działa normalnie. – Axxiss

+1

Wstrzykujesz przypadek testowy do grafu obiektu zamiast do aktywności? – SeanPONeil

Odpowiedz

3

Jak powiedział @AndyDennie w swoim komentarzu, nie robiłem zastrzyku w klasie testowej. Wstrzykiwanie testowanej aktywności zamiast tworzenia jej na setUp() rozwiązało problem.

Mój obecny przypadek testowy (odpowiedni kod) wygląda następująco:

@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

Drobny komentarz: Wierzę, że jeśli podasz operator TelephonyManager za pomocą @Singleton, nie musisz zadeklarować statycznej instancji (TELEPHONY_MANAGER) i zwrócić jej. Możesz zwrócić Mockito.mock (TelephonyManager.class) w metodzie zapewnia, ponieważ zostanie wykonany tylko raz. – GaRRaPeTa