2014-07-25 13 views
20

का उपयोग करके कोई नेटवर्क अनुकरण नहीं करें RetroFit और MockWebServer का उपयोग करते समय मैं कोई नेटवर्क केस अनुकरण करना चाहता हूं।रेट्रोफिट और मॉकवेबसेवर

मैं वर्तमान में Espresso का उपयोग करके परीक्षण कर रहा हूं और MockWebServer s url को RestAdapter पर अपने परीक्षण शुरू करने से पहले आपूर्ति करता हूं। यह सर्वर प्रतिक्रियाओं का मज़ाक उड़ाने के लिए बहुत अच्छा काम करता है और इसलिए जब किसी डिवाइस के पास नेटवर्क नहीं है तो java.net.ConnectException अपवाद फेंकने का एक आसान तरीका नहीं देख सकता। मैं देख सकता हूं कि मॉक रेस्पॉन्स थ्रॉटलिंग सिमुलेशन की अनुमति देता है और इतने पर, लेकिन कस्टम अपवाद नहीं।

मैं जानता हूँ कि मैं वास्तविक वेब एपीआई retrofit द्वारा इस्तेमाल किया इंटरफ़ेस मजाक की जड़ जा सकते हैं, लेकिन मैं MockWebServer का उपयोग करके यदि संभव हो तो अपने अन्य परीक्षणों के समान दृष्टिकोण का उपयोग करना चाहते हैं।

मैं कल्पना मैं सिर्फ कुछ सरल :)

धन्यवाद नहीं छूटा है

उत्तर

22

रेट्रोफिट एक retrofit-mock मॉड्यूल जो एक MockRestAdapter वर्ग जिसका प्रदान करता है उद्देश्य नेटवर्क देरी और त्रुटियों का अनुकरण करना है।

यह आपकी सेवा का उदाहरण बनाने के लिए सामान्य RestAdapter के संयोजन के साथ प्रयोग किया जाता है। मिलीसेकेंड में नेटवर्क राउंड ट्रिप देरी सेट, -

  • setDelay: आप रेपो की samples/mock-github-client/ फ़ोल्डर में एक पूर्ण उदाहरण देख सकते हैं: https://github.com/square/retrofit/tree/parent-1.9.0/retrofit-samples/mock-github-client

    MockRestAdapter इन API प्रदान करता है।

  • setVariancePercentage - नेटवर्क राउंड ट्रिप विलंब के प्लस-या-माइनस भिन्नता प्रतिशत सेट करें।
  • setErrorPercentage - calculateIsFailure() पर कॉल का प्रतिशत सेट करें जो true लौटाता है।

अपने परीक्षण में, आप setErrorPercentage(100) पर कॉल कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि नेटवर्क त्रुटि उत्पन्न होगी। डिफ़ॉल्ट रूप से त्रुटि को फेंकने के लिए समय की मात्रा 0 से 3x देरी से कहीं भी है। तत्काल परिणामों के लिए देरी 0 पर सेट करें।

+2

के अनुसार अंतर्निहित फेंकता है लिंक टूट गया है :( –

+0

अपडेट किया गया लिंक: https: // github .com/square/retrofit/blob/master/retrofit-mock/src/test/java/retrofit2/mock/mockRetrofitTest.java –

+0

महोदय, मैं mockwebserver से एक को रेट्रोफिट के बेसरल को ओवरराइड करने का प्रयास करता हूं, लेकिन फिर भी मैं समाप्त होता हूं परीक्षण करते समय एक webservice कॉल करना, क्या इसे रोकने का कोई तरीका है? कृपया सहायता करें। @ टोनी 1 9, जेक व्हार्टन –

6

साथ स्पष्ट होना whe अपवाद के प्रकार यहाँ आप अंतर देख सकते हैं:

Internet Connection Error

तो तुम दो प्रकार प्राप्त कर सकते हैं:

अज्ञातहोस्ट एक्सेप्शन - डब्ल्यू मुर्गी आपके पास इंटरनेट या अज्ञात होस्ट नहीं है ... इसे अनुकरण करने के लिए, एडाप्टर को गलत अंत बिंदु पर सेट करें।

कनेक्ट अपवाद - mockwebserver एक टाइमआउट अपवाद फेंक सकता है। आप इसे यहाँ कैसे करना है देख सकते हैं:

https://github.com/square/okhttp/tree/master/mockwebserver

सच मैं कैसे अपने कोड है पता नहीं है, लेकिन मुझे आशा है कि यह उपयोगी

+0

+1 उत्तर देने के लिए धन्यवाद लेकिन यह वास्तव में प्रश्न का उत्तर नहीं देता है क्योंकि मैं टाइमआउट के विरोध में कोई नेटवर्क अनुकरण नहीं करना चाहता हूं। डिस्पैचर्स हालांकि दिलचस्प है। मुझे आश्चर्य है कि क्या मैं उपरोक्त अपवादों को फेंक सकता हूं हालांकि ... – Dori

+0

लगता है कि नेटवर्क अपवादों की जांच के रूप में मैं नहीं कर सकता और प्रेषक केवल अपने इंटरफ़ेस – Dori

1

मैं अगर यह उपयोगी है पता नहीं है, लेकिन आप MockWebServer के साथ एक समय समाप्ति अनुकरण कर सकते हैं:

String contentType = "Content-type: application/json"; 
MockResponse response = MockResponse().setResponseCode(statusCode).setBody(responseBody).addHeader(contentType); 
MockWebServer proxy = new MockWebServer(); 
proxy.enqueue(response); 
proxy.setBodyDelayTimeMs(timeoutDelay)); 
proxy.play(10000); //Number port - Important!!! 

नोट: कृपया, परीक्षण के लिए उस नंबर पोर्ट के साथ अपने कोड (जैसे AsyncHttpClient) के HttpClient निर्धारित किया है।