2016-02-19 4 views
27

मॉकिटो प्रॉक्सी उदाहरण बनाता है जब कुछ चीज पर जासूसी होती है। अब, क्या उन प्रॉंटर को आगे बढ़ाने का कोई तरीका है जिसे उस प्रॉक्सी इंस्टेंस पर निष्पादित किया गया है जो वास्तविक उदाहरण के लिए है जो इसके पीछे बैठता है?किसी गतिविधि पर ठीक से जासूसी कैसे करें

तर्क: मेरे पास एक ऑब्जेक्ट उदाहरण है कि मेरे पास पूरी तरह से मेरे नियंत्रण में नहीं है, यानी एक एंड्रॉइड गतिविधि है। मैं अपने ऐप के अधिकांश हिस्सों को प्रॉक्सी संस्करण दे सकता हूं और लेकिन जैसा कि ठीक है, क्योंकि मुझे गतिविधि के निर्माण चरण के दौरान बहुत जल्दी जासूस/प्रॉक्सी बनाने की आवश्यकता है, यह अभी तक पूरी तरह से तत्काल नहीं है, उदाहरण के लिए आधार संदर्भ संलग्न नहीं है। यह प्रॉक्सी इंस्टेंस पर होता है और निश्चित रूप से गतिविधि उदाहरण द्वारा उपयोग नहीं किया जाता है (जो Activity.this के माध्यम से स्वयं को संदर्भित करता है)। अंत परिणाम यह है कि इससे सभी प्रकार की दुर्घटनाएं होती हैं क्योंकि इस आधार संदर्भ के माध्यम से संसाधन समाधान होता है, इसलिए आंतरिक फ्रैगमेंट मशीनरी एनपीई और अधिक फेंकता है। - किसी भी विचार

public class CustomAndroidJUnitRunner extends AndroidJUnitRunner { 
    @Override 
    public Activity newActivity(ClassLoader cl, String className, Intent intent) 
      throws InstantiationException, IllegalAccessException, ClassNotFoundException { 
     Activity activity = super.newActivity(cl, className, intent); 
     return maybeStubSomeDelegate(activity); 
    } 

    private Activity maybeStubSomeDelegate(Activity activity) { 
     if (!(activity instanceof SomeDelegate)) { 
      return activity; 
     } 
     Activity spiedActivity = spy(activity); 
     doReturn(SomeDelegateMock.getInstance()) 
      .when((SomeDelegate) spiedActivity) 
      .getDelegate(); 
     return spiedActivity; 
    } 
} 

मैं पता कर रहा हूँ:

यहाँ कुछ कोड है?

+0

आप एस्प्रेसो क्यों उपयोग नहीं करते हैं: https://google.github.io/android-testing-support-library/docs/espresso/ तो तुम गतिविधि भी नियंत्रित कर सकते हैं। –

+0

मैं पहले से ही एस्प्रेसो का उपयोग कर रहा हूं, इसका मेरे प्रश्न से कोई लेना देना नहीं है। –

+0

प्रश्न के बाहर आपकी गतिविधि के लिए एक @VisibleForTesting setDelegate() विधि जोड़ रहा है? मुझे लगता है कि गतिविधि के जासूसों को इंजेक्शन देने वाले किसी भी दृष्टिकोण में हमेशा कुछ बढ़त का मामला होगा जहां यह काम नहीं करेगा। – jdonmoyer

उत्तर

0

आप अपनी खुद की प्रॉक्सी बनाने के लिए Robolectric उपयोग कर सकते हैं (या के रूप में Robolectric उन्हें कॉल "छाया") अपनी गतिविधि को,

जब आप प्रॉक्सी बनाने आप अपने खुद के setters कि वास्तविक वस्तु के तरीकों को गति प्रदान कर सकते हैं बना सकते हैं,

एक छाया उदाहरण बनाने के लिए कैसे:

@Implements(Bitmap.class) 
public class MyShadowBitmap { 

@RealObject private Bitmap realBitmap; 
private int bitmapQuality = -1; 

@Implementation 
public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream) { 
    bitmapQuality = quality; 
    return realBitmap.compress(format, quality, stream); 
} 

public int getQuality() { 
    return bitmapQuality; 
} 
} 
} 

जब @RealObject अपने वास्तविक उदाहरण है,

इस s का उपयोग करने के

@RunWith(RobolectricTestRunner.class) 
@Config(shadows = MyShadowBitmap.class) 
public class MyTestClass {} 

खींच करने के लिए वर्तमान छाया उदाहरण विधि का उपयोग करें: Robolectric को

shadowOf() 

और किसी भी मामले में, यहाँ है लिंक: hadow इस प्रकार Robolectric परीक्षण धावक एक नया परीक्षण वर्ग को परिभाषित का उपयोग कर

http://robolectric.org/custom-shadows/

+0

यह यूनिट परीक्षण के लिए उपयोगी हो सकता है, लेकिन मैं वास्तव में उपकरण परीक्षण के बारे में बात कर रहा था :) –

+0

उपकरण परीक्षण के लिए भी उपयोगी (माना जाता है कि आप उन्हें डिवाइस \ emulator पर नहीं चलाना चाहते हैं) –

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