2013-03-06 21 views
6

Hançer hizmetini TelephonyManager Hançer ile enjekte etmeye çalışıyorum. Bunu takip ediyorum sample. Grafiği oluşturmak için Application sınıfını genişlettim ve ServiceModule'un yer aldığı bir ApplicationModule'u tanımladım ve diğer modüller gelecekte dahil edilecek.Hançer ve Robolectric ile enjekte etme hizmeti

Düzenleme:

Şimdi sistem hizmeti sorunsuz bir Activity üzerine enjekte edilir. Activity'un içinde FinderApplication.inject(this) eksikti. Bir enjeksiyonu vardır, ancak hala Robolectric ile test altında enjekte etmez. Bu yazının altındaki test case ekledi:

Düzenleme-2: onCreate yöntemine

((FinderApplication) getApplication()).getGraph().inject(this); 

: ile BaseActivity oluşturulan ApplicationModule silinir ve.) (ServiceModule

Ama boş bir yapıcı tanımlarsanız enjekte sınıftır zaman boş bir işaretçi olsun. Java.lang.NoSuchMethodException:

Neden Olduğu: Ben alıyorum hatadır gerekli.

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

Ben diğer modüller için üye sağlayacaktır @Module açıklama bayrağı içerir sanmıyorum. "içerir", her giriş noktasındaki tüm enjekte edilebilir üyelerin tatmin olduğundan emin olmak için başka bir modül kullanmak içindir, böylece modül tam bir nesne grafiği oluşturur. – SeanPONeil

+0

Bu, bayrakların belirtilen modülleri içermesi gibi görünüyor. Çünkü uygulama normal olarak çalışırken enjekte ediyor. – Axxiss

+1

Test örneğini etkinlik yerine nesne grafiğine enjekte edersiniz, belki? – SeanPONeil

cevap

3

@AndyDennie, yaptığı açıklamada test sınıfında hiçbir enjeksiyon yapmamayı söyledi. setUp()'da oluşturmak yerine test altındaki aktiviteyi enjekte etmek problemi çözdü. (Ilgili kodu)

Benim şu anki test durumu şuna benzer:

@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

Küçük Yorum: TelephonyManager'ı @Singleton ile sağladığınızda, statik bir örneği (TELEPHONY_MANAGER) bildirmeniz ve geri göndermeniz gerekmediğine inanıyorum. Mockito.mock (TelephonyManager.class) komutunu, yalnızca bir kez gerçekleştirilecek olan sağlama yöntemine yönlendirebilirsiniz. – GaRRaPeTa