2013-05-06 8 views
5

मैं RoboGuice 2.0 का उपयोग कर एंड्रॉइड सेवा के लिए एक जुनीट परीक्षण लिखने की कोशिश कर रहा हूं। मेरे पास एक परीक्षण मॉड्यूल है जो मॉकिटो मॉक ऑब्जेक्ट्स को इंजेक्शन निर्भरता को बांधता है। हालांकि, जब मैं परीक्षण चलाता हूं, तो मेरे ऐप मॉड्यूल से वास्तविक कार्यान्वयन इसके बजाय इंजेक्शन मिलता है।RoboGuice इकाई परीक्षण परीक्षण मॉड्यूल के बजाय ऐप मॉड्यूल इंजेक्शनिंग

MainApplication.java:

public class MainApplication extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, 
      RoboGuice.newDefaultRoboModule(this), new MainModule()); 
     startService(new Intent(this, NotificationService.class)); 
    } 
} 

MainModule.java:

public class MainModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(IFooManager.class).to(FooManagerImpl.class).in(Scopes.SINGLETON); 
    } 
} 

NotificationService.java:

public class NotificationService extends RoboService { 
    @Inject 
    private NotificationManager notificationManager; 
    @Inject 
    private SharedPreferences prefs; 
    @Inject 
    private IFooManager fooManager; 
    private IFooListener listener = new FooListener(); 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     fooManager.addListener(listener); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     fooManager.removeListener(listener); 
    } 

    private class FooListener implements IFooListener { 
     // Do stuff that fires Notifications 
    } 
} 

NotificationServiceTest.java:

यहाँ प्रासंगिक कोड के कुछ है
public class NotificationServiceTest extends ServiceTestCase<NotificationService> { 
    @Mock 
    private MockFooManager fooManager; 
    @Mock 
    private MockSharedPreferences prefs; 

    public NotificationServiceTest() { 
     super(NotificationService.class); 
    } 

    public void testStart() { 
     startService(null); 
     verify(fooManager).addListener(isA(IFooListener.class)); 
    } 

    public void testStop() { 
     shutdownService(); 
     verify(fooManager).removeListener(isA(IFooListener.class)); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     MockitoAnnotations.initMocks(this); 
     Application app = new MockApplication(); 
     setApplication(app); 
     RoboGuice.setBaseApplicationInjector(app, RoboGuice.DEFAULT_STAGE, new TestModule()); 
    } 

    @Override 
    protected void tearDown() throws Exception { 
     super.tearDown(); 
     RoboGuice.util.reset(); 
    } 

    private class TestModule extends AbstractModule { 
     @Override 
     protected void configure() { 
      bind(Context.class).toInstance(getContext()); 
      bind(IFooManager.class).toInstance(fooManager); 
      bind(SharedPreferences.class).toInstance(prefs); 
     } 
    } 
} 

मॉकफूमेनर और मॉकशेयर प्रीफर IFooManager और SharedPreferences के खाली अमूर्त कार्यान्वयन हैं, क्योंकि RoboGuice can't inject mocks of interfaces आवश्यक है। मैं मॉकिटो के साथ मैकिटो का उपयोग कर रहा हूं ताकि मैक क्लास के लिए बाइटकोड पीढ़ी का समर्थन किया जा सके। इसके अलावा, मैं रोबोइलेक्ट्रिक का उपयोग नहीं कर रहा हूं, मैं इन परीक्षणों को किसी डिवाइस या एमुलेटर में चला रहा हूं।

जब मैं यह परीक्षण चलाता हूं, तो मुझे Wanted but not invoked: fooManager.addListener(isA(com.example.IFooListener)) त्रुटि मिलती है। डीबगर के साथ कदम उठाने के बाद, मैंने पाया कि RoboGuice TestModule के बजाय मेन मॉड्यूल से निर्भरता इंजेक्शन दे रहा है, इसलिए परीक्षण MockFooManager के बजाय FooManagerImpl का उपयोग कर रहा है। मुझे समझ में नहीं आता कि रोबोगुइस टेस्ट कोड में मेन मॉड्यूल के बारे में भी कैसे जानता है।

यहाँ कुछ अन्य बातों मैं इसे ठीक करने की कोशिश की है, लेकिन कोई भी किसी भी प्रभाव नहीं पड़ा:

  • roboguice.xml में एप्लिकेशन मॉड्यूल निर्दिष्ट बजाय MainApplication.onCreate
  • में RoboGuice.setBaseApplicationInjector बुला उपयोग Modules.override जब RoboGuice.setBaseApplicationInjector बुला के बजाय सिर्फ पास करने का मॉड्यूल सूची सीधे।

मैं रोबोगुइस को टेस्ट मॉड्यूल का उपयोग करने और अपने यूनिट परीक्षण में मेन मॉड्यूल को अनदेखा कैसे करूं?

उत्तर

0

ऐसा लगता है कि आप अपने अधिसूचना सेवा सेवा में इंजेक्शन करने के लिए एक कॉल खो रहे हैं। यह इस प्रकार से किया जाता है:

RoboGuice.getInjector(app).injectMembers(this); 

आप कुछ बिंदु पर जोड़ने के लिए आप आधार इंजेक्टर स्थापना की और बाद से पहले परीक्षण चलाए जा रहे हैं की आवश्यकता होगी।

0

उपयोग

RoboGuice.overrideApplicationInjector(app,RoboGuice.newDefaultRoboModule(app), new TestModule()) 

बजाय

RoboGuice.setBaseApplicationInjector(app, RoboGuice.DEFAULT_STAGE, new TestModule()); 
संबंधित मुद्दे