मैं 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
बुला के बजाय सिर्फ पास करने का मॉड्यूल सूची सीधे।
मैं रोबोगुइस को टेस्ट मॉड्यूल का उपयोग करने और अपने यूनिट परीक्षण में मेन मॉड्यूल को अनदेखा कैसे करूं?