8

मुझे यह कैसे करना है इस पर कोई उदाहरण नहीं मिला है। मैं इसे संभालने कर रहा हूँ इस तरह उदाहरण के आधार पर संभव नहीं है:AndroidAnnotations के साथ परीक्षण उद्देश्यों के लिए मोक्स इंजेक्ट करना संभव है?

@Bean(MyImplementation.class) 
MyInterface myInterface; 

जहां वर्ग सुई पहले से ही निर्धारित होता है।

+0

क्या आप एंड्रॉइड एंटरोटेशन द्वारा उत्पन्न अपनी कक्षा या कक्षा का परीक्षण करना चाहते हैं? –

+0

मैं लिखने वाली कक्षा का परीक्षण करना चाहता हूं। मैं कक्षा में मैक्स इंजेक्ट करना चाहता हूं जिसे मैं टेस्ट कोड के लिए लिखता हूं, और उत्पादन के लिए "असली" ऑब्जेक्ट इंजेक्ट करता हूं। – apollodude217

उत्तर

6

सवाल यह है कि, क्या आप यूनिट परीक्षण या एकीकरण परीक्षण कर रहे हैं?

आप इकाई परीक्षण कर रहे हैं, मैं mocks पुराने जमाने तरह से उपयोग करते हुए, एक सेटर का उपयोग कर और इसमें शामिल निर्भरता इंजेक्शन ढांचे के बिना जावा कोड का परीक्षण करने की कोशिश करके सुझाव है। यह अलगाव में आपकी कक्षा का परीक्षण करेगा और बहुत जटिलता को दूर करेगा।

मैं क्या मतलब:

public class Test{ 

    ClassInTest inTest; 
    MyInterface myInterface; 

    @Before 
    public void setup(){ 
     inTest = new ClassInTest(); 
     //or your favorite mocking frameowrk 
     myInterface = EasyMock.createMock(MyInterface.class); 
     inTest.setMyInterface(myInterface); 
    } 

    @Test 
    public void testMethod(){ 
     //...mocking test code 
    } 
} 
बेशक

, परीक्षण एंड्रॉयड गतिविधियां (और Android के अन्य एक्सटेंशन) अपवाद स्टब्स और अंतिम वर्गों/तरीकों फेंकने की वजह से मुश्किल है। यह वह जगह है जहां Robolectric एंड्रॉइड एपीआई को तत्काल/छायांकन के लिए आसान (और अत्यधिक अनुशंसित) में आता है।

आप एक और तरीका अपनाने चाहते हो सकता है आप एकीकरण परीक्षण कर रहे हैं। निजी तौर पर, मैं एकीकरण परीक्षण के दौरान नकल नहीं करने की कोशिश करता क्योंकि मैं आवेदन में परीक्षण करने की कोशिश करता हूं क्योंकि यह उत्पादन में भाग लेगा। लेकिन, यदि आप वास्तव में नकल करना चाहते हैं, तो आप इकाई परीक्षण के लिए एक समान दृष्टिकोण का उपयोग कर सकते हैं और अपनी जेनरेट गतिविधि गतिविधि को खड़े करने के बाद एक नकली पेश कर सकते हैं। ध्यान देने योग्य मूल्य, आप Robotium जैसे ढांचे का उपयोग करके सीधे हार्डवेयर पर एकीकरण परीक्षण कर सकते हैं।

आपके प्रश्न के लिए, मुझे विशेष रूप से मोक्स इंजेक्शन देने या एप्लिकेशन के इंजेक्शन निर्भरता पेड़ में मोक्स पेश करने के लिए AndroidAnnotations की किसी भी सुविधा से अवगत नहीं है।

+0

धन्यवाद। मैं इकाई परीक्षणों के लिए Robolectric का उपयोग शुरू कर दिया है। उदाहरण में आपने ऊपर दिया है, क्या आप टेस्ट विधि में अपनी कक्षा के निर्माता को पूरी तरह से परीक्षण के दौरान AndroidAnnotations को बाईपास करने के लिए कह रहे हैं? – apollodude217

+1

कन्स्ट्रक्टर को कॉल करना (Robolectic शामिल के साथ) आपको गतिविधि का एक उदाहरण देता है। मैं यह नहीं कहूंगा कि यह AndroidAnnotaions को छोड़ देता है। लेकिन, यदि आप अपनी कक्षा "माईएक्टिविटी" (बनाम "माईएक्टिविटी_") का परीक्षण करते हैं तो आपके पास एए से DI के लिए जेनरेट कोड उत्पन्न नहीं होगा। –

8

johncarl के लिए एक पूरक जवाब:

  • वहाँ क्योंकि यह संकलन समय पर काम करता है, कोई रास्ता नहीं AndroidAnnotations कि आप असली वस्तुओं के बजाय mocks इंजेक्षन करना चाहते हैं यह बताने के लिए है, तो कोड हमेशा उत्पादन होना चाहिए तैयार।

  • मैं Robolectric साथ गईं गतिविधियों का परीक्षण, पूरक में की सिफारिश करेंगे। एनोटेशन आपके कोड में व्यवहार जोड़ रहे हैं, इसलिए आपको इसका परीक्षण नहीं करना चाहिए जैसे कि कोई टिप्पणी नहीं हुई थी।

  • अपनी गतिविधियों व्यवहार, नहीं AndroidAnnotations के व्यवहार का परीक्षण करने के प्रति सावधान रहें। फ्रेमवर्क में पहले से ही जांच है कि एनोटेशन सही ढंग से काम करते हैं :)।

  • आप AndroidAnnotations डि जगह पर छोड़ दें, और फिर मज़ाक उड़ाया निर्भरता reinject। फ़ील्ड में कम से कम डिफ़ॉल्ट दायरा है, जिसका अर्थ है कि उन्हें उसी पैकेज से एक्सेस किया जा सकता है, इसलिए आपको गतिविधि के समान पैकेज में परीक्षण करना होगा।

    MyActivity_ activity = new MyActivity_(); 
    
    // myInterface gets injected 
    activity.onCreate(null); 
    
    // you reinject myInterface 
    activity.myInterface = Mockito.mock(MyInterface.class); 
    
  • AndroidAnnotations में, निर्भरता MyImplementation_.getInstance_() फोन करके इंजेक्शन कर रहे हैं। MyImplementation_ की विधि को एक नकली वापस करने के लिए आप PowerMock जैसे टूल के साथ रनटाइम बाइटकोड मैनिपुलेशन का उपयोग कर सकते हैं। हालांकि कुछ प्रारंभिक काम की आवश्यकता हो सकती है, क्योंकि आपको PowerMock test Runner और Robolectric परीक्षण धावक को मिश्रण करना होगा।

संपादित करें: मैंने इस प्रश्न के आधार पर सामग्री के साथ documentation अद्यतन किया है।

+1

+1। यह दिलचस्प है कि आप जेनरेट की गई गतिविधियां (pt.2) का परीक्षण करने का सुझाव देते हैं। मुझे लगता है कि इस दृष्टिकोण को वारंट करने के लिए गतिविधि में पर्याप्त बदलाव हैं। –

+0

यह बिल्कुल मेरी बात है :) –

+1

@ Piwaï मुझे यकीन नहीं है कि उपरोक्त मॉकिंग दृष्टिकोण कैसे काम करेगा। यदि आपके पास AfterViews के साथ एनोटेटेड कोई भी तरीका है तो उन्हें गतिविधि निर्माण के हिस्से के रूप में निष्पादित किया जाएगा। यदि इन विधियों की कोई निर्भरता है तो वे असफल हो जाएंगे - क्योंकि आपके पास अभी तक उन्हें मजाक करने का मौका नहीं मिला है। इस पर काम करने के तरीके पर कोई विचार? – Neil

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