के लिए एक डैगर 2 इंजेक्शन निर्भरता का मज़ाक उड़ा रहा है। मेरे पास भारी निर्भरता इंजेक्शन (डैगर 2) एप्लिकेशन है। मैं पूरे आवेदन के माध्यम से परीक्षण नेविगेट किए बिना, एस्प्रेसो परीक्षण चलाने के लिए, और एप्लिकेशन में लॉग इन करना चाहता हूं।एंड्रॉइड एक एस्प्रेसो परीक्षण
मैं अपनी टेलीएक्टिविटी शुरू करना चाहता हूं, और लॉगिन प्रबंधक का मज़ाक उड़ाऊंगा। हालांकि किसी भी @ टेस्ट फ़ंक्शन में, हमने पहले से ही शून्य सूचक को मारा है क्योंकि हमने क्रेट को बुलाया है। अगर हम गतिविधि लॉन्च करने से पहले इसे ओवरराइड करते हैं (नीचे दिखाएं) गतिविधि शून्य है।
मेरी समझ के लिए, हमारी रेखांकित निर्भरताओं को स्विच करने की क्षमता एक बड़ा कारण है कि हम डैगर 2 का उपयोग क्यों करते हैं, अन्यथा यह केवल एक बहुत अधिक इंजीनियर सिंगलटन होगा। मैं एक परीक्षण डैगर मॉड्यूल में इंजेक्शन को ओवरराइड, नकली या स्विच कैसे करूं - इसलिए मैं यह सरल एस्प्रेसो परीक्षण बना सकता हूं।
नोट मैंने एमवीपी डिज़ाइन पैटर्न में यह सब भी लिखा है यदि इससे कोई फर्क पड़ता है।
TeleActivity
@Inject
TelePresenter mTelePresenter;
@Inject
public LoginStateManager mLoginStateManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ButterKnife.bind(this);
DaggerInjectorTele.get().inject(this);
mTelePresenter.setTeleDependencies(this);
Intent intent = getIntent();
String searchId = null;
if (intent != null) {
searchId = intent.getStringExtra(Constants.SEARCH_ID);
}
mTelePresenter.onCreateEvent(searchId,
Helper.makeAuthorizationHeader(
// CRASH Null pointer
mLoginStateManager.getBaseLoginResponse().getAccessToken()));
}
एस्प्रेसो
@LargeTest
@RunWith(AndroidJUnit4.class)
public class TeleTest {
@Rule
public ActivityTestRule<TeleActivity> mActivityTestRule = new ActivityTestRule(
TeleActivity.class) {
@Override
protected void beforeActivityLaunched() {
super.beforeActivityLaunched();
TeleActivity teleActivity = (TeleActivity)getActivity();
//teleActivity NULL!
teleActivity.mLoginStateManager = mock(LoginStateManager.class);
LoginResponse loginResponse = mock(LoginResponse.class);
when(loginResponse.getAccessToken()).thenReturn("1234");
// Nope here still null
when(teleActivity.mLoginStateManager.getBaseLoginResponse()).thenReturn(loginResponse);
}
};
डैगर इंजेक्टर
public class DaggerInjectorTele {
private static TelePresenterComponent telePresenterComponent =
DaggerTelePresenterComponent.builder().build();
public static TelePresenterComponent get() {
return telePresenterComponent;
}
}
TelePresenterComponent
@Singleton
@Component(modules = {TelePresenterModule.class,
LoginStateManagerModule.class})
public interface TelePresenterComponent {
void inject(TeleActivity activity);
}
TelePresenterModule
@Module
public class TelePresenterModule {
@Provides
@Singleton
public TelePresenter getTelePresenter() {
return new TelePresenter();
}
}
LoginStateManagerModule
@Module
public class LoginStateManagerModule {
@Provides
@Singleton
public LoginStateManager getLoginStateManager(){
return new LoginStateManager();
}
}
मैं बहुत करीब था! मैंने देखा अन्य उदाहरण इंजेक्टर को ओवरराइड नहीं किया था। मैंने एक और चीज की, जिसे मैं अपने प्रश्न के तहत पोस्ट करूंगा। – StarWind0