2013-03-06 16 views
6

के साथ सेवा इंजेक्ट करें मैं डैगर के साथ सेवा TelephonyManager सेवा इंजेक्ट करने की कोशिश कर रहा हूं। मैं इस sample का पालन कर रहा हूं। मैंने ग्राफ़ बनाने के लिए Application कक्षा को बढ़ाया और ApplicationModule परिभाषित किया जहां ServiceModule शामिल है और अन्य मॉड्यूल भविष्य में शामिल किए जाएंगे।डैगर और रोबोलेक्ट्रिक

संपादित करें:

अब सिस्टम सेवा बिना किसी समस्या के एक Activity पर इंजेक्ट किया जाता है। Activity के अंदर FinderApplication.inject(this) गुम था। इसमें इंजेक्शन है लेकिन अभी भी Robolectric के साथ परीक्षण के तहत इंजेक्शन नहीं है। मैं इस पोस्ट के निचले भाग में परीक्षण का मामला कहा:

संपादित -2: onCreate पद्धति पर

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

: ApplicationModule नष्ट कर दिया और साथ बनाया BaseActivity। त्रुटि मैं हो रही है: java.lang.NoSuchMethodException:

की वजह से। ServiceModule()

लेकिन जब इंजेक्शन वर्ग है अगर मैं एक खाली निर्माता को परिभाषित मैं एक अशक्त सूचक मिलता है जरूरत है।

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

मुझे नहीं लगता कि @Module एनोटेशन अन्य मॉड्यूल के लिए सदस्यों को प्रदान करेगा में झंडा भी शामिल है। "शामिल है" यह सुनिश्चित करने के लिए एक और मॉड्यूल का उपयोग करने के लिए है कि प्रत्येक प्रविष्टि बिंदु में सभी इंजेक्शन योग्य सदस्य संतुष्ट हैं, ताकि मॉड्यूल एक पूर्ण ऑब्जेक्ट ग्राफ़ बनाता है। – SeanPONeil

+0

ऐसा लगता है जैसे ध्वज में वास्तव में निर्दिष्ट मॉड्यूल शामिल हैं। क्योंकि ऐप सामान्य रूप से चल रहा है जब इंजेक्शन है। – Axxiss

+1

आप गतिविधि के बजाए ऑब्जेक्ट ग्राफ़ में टेस्ट केस इंजेक्शन कर रहे हैं, शायद? – SeanPONeil

उत्तर

3

@ एंडी डेनी ने अपनी टिप्पणी पर कहा कि मैं टेस्ट क्लास में इंजेक्शन नहीं कर रहा था। setUp() पर इसे बनाने के बजाय परीक्षण के तहत गतिविधि को इंजेक्शन देने से समस्या हल हो गई।

मेरे वर्तमान परीक्षण का मामला (प्रासंगिक कोड) इस तरह दिखता है:

@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

मामूली टिप्पणी: मेरा मानना ​​है कि यदि आप टेलीफ़ोनी प्रबंधक को @ सिंगलेटन के साथ प्रदान करते हैं, तो आपको एक स्थिर उदाहरण (TELEPHONY_MANAGER) घोषित करने की आवश्यकता नहीं है और इसे वापस कर दें। आप प्रदान विधि में Mockito.mock (TelephonyManager.class) को वापस भेज सकते हैं, क्योंकि इसे केवल एक बार निष्पादित किया जाएगा। – GaRRaPeTa

संबंधित मुद्दे