मैं lazily वस्तु ग्राफ़ बनाने के द्वारा ActivityInstrumentationTestCase2
साथ डैगर उपयोग करने के लिए एक रास्ता मिल गया है। मैं जो करता हूं वह ऑब्जेक्ट ग्राफ़ बनाने के लिए प्रतीक्षा करता है जब तक कि कक्षा पहली बार इंजेक्शन नहीं लेती, तब तक जब तक आप getActivity()
(जो परीक्षण के तहत गतिविधि के लिए गतिविधि जीवन चक्र शुरू करता है) को कॉल करने से पहले अपने मॉड्यूल जोड़ते हैं और overrides = true
का उपयोग करें परीक्षण मॉड्यूल, यह काम करेगा। यहां प्रासंगिक कक्षाएं और स्निपेट हैं:
GraphHolder
, जैसा कि नाम का तात्पर्य है, हमारे लिए ObjectGraph
ऑब्जेक्ट रखता है। हम ObjectGraph
पर सीधे इस वर्ग में सभी कॉल करेंगे।
public class GraphHolder {
private static GraphHolder sInstance;
private Object[] mModules;
private ObjectGraph mGraph;
private GraphHolder() {
}
public static GraphHolder getInstance() {
if (sInstance == null) {
sInstance = new GraphHolder();
}
return sInstance;
}
public void inject(Object object) {
if (mGraph == null) {
create();
}
mGraph.inject(object);
}
public <T> T get(Class<T> type) {
if (mGraph == null) {
create();
}
return mGraph.get(type);
}
public void addModules(Object... modules) {
if (mGraph != null) {
mGraph.plus(modules);
} else {
if (mModules == null) {
mModules = modules;
} else {
mModules = concatenate(mModules, modules);
}
}
}
private void create() {
mGraph = ObjectGraph.create(mModules);
mModules = null;
}
private Object[] concatenate(Object[] a, Object[] b) {
int aLength = a.length;
int bLength = b.length;
Object[] c = new Object[aLength + bLength];
System.arraycopy(a, 0, c, 0, aLength);
System.arraycopy(b, 0, c, aLength, bLength);
return c;
}
}
हम Application
कक्षा में हमारे मॉड्यूल जोड़ देंगे:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
GraphHolder.getInstance().addModules(getModules());
}
Object[] getModules() {
return new Object[]{
// your modules here
};
}
}
कक्षाओं हम इंजेक्षन करना चाहते हैं अंदर, हम बस GraphHolder.getInstance().inject(this)
बजाय ObjectGraph.inject(this)
हमारे परीक्षण मॉड्यूल में फोन करता हूँ , हम उन वस्तुओं को प्रदान करेंगे जिन्हें हम परीक्षण के लिए ओवरराइड करना चाहते हैं और overrides = true
@Module
एनोटेशन में जोड़ें। यह ऑब्जेक्ट ग्राफ़ को इस मॉड्यूल के प्रदाताओं को किसी अन्य संघर्ष पर प्राथमिकता देने के लिए कहता है।
फिर, हमारे परीक्षणों में:
@Inject Foo mFoo;
@Override
public void setUp() {
super.setUp();
GraphHolder.getInstance().addModules(new TestFooModule());
GraphHolder.getInstance().inject(this); // This is when the object graph will be created
}
तो यह आसान नहीं यहाँ क्या चल रहा है देखने के लिए, क्योंकि हम नहीं देखते हैं क्या आप परीक्षण में इंजेक्शन लगाने रहे हैं, आदि आप ट्रिम और प्रदान कर सकते हैं आपके उत्पादन और परीक्षण मॉड्यूल का एक सरल उदाहरण, जो इस मुद्दे को दोहराता है? –
हो सकता है कि यह संबंधित पोस्ट में मेरा उत्तर में सहायक है: http://stackoverflow.com/questions/15630589/android-functional-testing-with-dagger?rq=1 – IIIRepublica