2013-12-13 10 views
6

मैं एक टोंटदार JSON ऑब्जेक्ट है, लेकिन निम्न का उपयोग कर Mockito नकली की जरूरत है:HTTP क्लाइंट के लिए Mockito का उपयोग

HttpResponse response = defaultHttpClient.execute(postRequest); 
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
StringBuilder result = new StringBuilder(); 
while ((line = rd.readLine()) != null) { 
    result.append(line);   
} 
JSONObject jsonResponseObject = new JSONObject(result.toString()); 

मैं निम्नलिखित Mocks बनाया है:

@Mock 
    private HttpClient mockHttpClient; 
    private HttpPost mockHttpPost; 
    private HttpResponse mockHttpResponse; 
    private HttpEntity mockHttpEntity; 
    private InputStream mockInputStream; 
    private InputStreamReader mockInputStreamReader; 
    private BufferedReader mockBufferedReader; 

और when बयान निम्नलिखित है :

Mockito.when(mockHttpClient.execute(mockHttpPost)).thenReturn(mockHttpResponse); 
    Mockito.when(mockHttpResponse.getEntity()).thenReturn(mockHttpEntity); 
    Mockito.when(mockHttpEntity.getContent()).thenReturn(mockInputStream); 

प्रश्न: मैं इन सभी 'जब' statem बनाना होगा ents और यदि हां तो मुझे किस दूसरे को स्टब किए गए JSON पर जाने में सक्षम होने की आवश्यकता है?

कोई सुझाव कृपया?

धन्यवाद

+0

कृपया कुछ और कोड जोड़ें ताकि हम सटीक मॉकिंग ऑब्जेक्ट्स को समझ सकें –

+0

क्या आप स्प्रिंग एमवीसी जैसे किसी भी वेब ढांचे का उपयोग कर रहे हैं? – SergeyB

उत्तर

1

हाँ, आप सभी जब बयान है कि आप उल्लेख किया है आवश्यकता हो सकती है। लेकिन बजाय mockInputStream लौटने की, तो आप सिर्फ new ByteArrayInputStream("{foo : 'bar'}".getBytes())

अंत में लौट सकता है, आपको लगता है कि json प्रतिक्रिया ऑब्जेक्ट एक 'foo' संपत्ति एक मूल्य के 'बार' है कि है की पुष्टि कर सकते हैं।

यह कहा गया कि, मुझे यकीन नहीं है कि दी गई विधि परीक्षण के लायक है - क्योंकि यह सब स्ट्रीम खोलती है और डेटा पढ़ती है।

0

सबसे पहले Mocking का अर्थ समझें।

1) हमें मॉकिंग की आवश्यकता क्यों है?

मान लीजिए कि हम किसी भी मूल विधि को कॉल नहीं करना चाहते हैं और चाहते हैं कि उस मूल विधि के बजाय हमें एक डमी विधि कॉल करनी चाहिए तो हमें मॉकिंग के लिए जाना चाहिए।

उदाहरण के लिए:

Mockito.when(mockHttpClient.execute(mockHttpPost)).thenReturn(mockHttpResponse) 

इसका मतलब यह है कि जब भी इस execute() बुलाया जाएगा तो आप मूल mockHttpResponse के बजाय अपने खुद के तैयार मान प्रदान करेंगे।

तो यदि आपके मामले में इसकी आवश्यकता है तो अपने मामले में अपनी स्टब ऑब्जेक्ट और नकली तैयार करें। यहां आप अपनी प्रतिक्रिया तैयार करते हैं (नोट वास्तविक लेकिन डमी)।

mockHttpResponse.setEntity(new Entity()); 
mockHttpResponse.getEntity().setContent('{yourJsonString}'); 

तो जब भी अपने

mockHttpClient.execute(mockHttpPost); //will be called 

तो यह प्रतिक्रिया है कि यदि आप स्वयं अपनी परीक्षा पद्धति में तैयार वापस आ जाएगी।

अपने नियंत्रण

new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

की बात आती है तो फिर तुम {yourJsonString} जब response.getEntity().getContent() कहा जाता है और बाकी कोड अपनी कार्यक्षमता करने देंगे। अंत में आपके JSON stubbed ऑब्जेक्ट तैयार किया जाएगा।

याद रखें परीक्षण के मामले केवल डेवलपर्स की मदद के लिए हैं। हम कुछ भी नकल कर सकते हैं और कुछ भी या किसी भी स्टब ऑब्जेक्ट को वापस कर सकते हैं। बस हम अपेक्षित और गैर अपेक्षित मूल्यों को पार करके हमारे नियंत्रण प्रवाह की जांच के लिए टेस्ट केस लिखते हैं।

यह आपके काम को आसान बना देगा.अब आप अपने बफर रीडर क्लास का उपयोग करना चाहते हैं।

BufferedReader bufferedReader = org.mockito.Mockito.mock(BufferedReader.class); 
when(bufferedReader.readLine()).thenReturn("first line").thenReturn("second line"); 

org.junit.Assert.when(new Client(bufferedReader).parseLine()).thenEquals(IsEqual.equalTo("1")); 
+0

हाय शोएब, स्पष्टीकरण के लिए धन्यवाद !! सुनिश्चित नहीं है कि यहां क्या करने की आवश्यकता है, लेकिन मैं एक वास्तविक HttpClient कॉल बनाने से बचने की कोशिश कर रहा हूं क्योंकि मेरे पास इस कॉल से प्रतिक्रिया का अंतिम संसाधित (विश्लेषण) संस्करण है, जो कि एक JSON ऑब्जेक्ट है जिसे मैंने दबाया है। कृपया सलाह दें .. धन्यवाद –

+0

कृपया अद्यतन कोड –

+0

देखें यह बहुत उपयोगी है। लेकिन जैसा कि मैंने अपने प्रश्न में उपर्युक्त उल्लेख किया है, मैं एक mockHttpResponse वापस करता हूं जब HttpResponse प्रतिक्रिया = defaultHttpClient.execute (postRequest) कहा जाता है। लेकिन फिर वास्तविक विधि में, JSON ऑब्जेक्ट लौटाए जाने से पहले मुझे 3 चरणों का पालन करना होगा। इसलिए, अगर मैं stubbed JSON ऑब्जेक्ट को वापस भेजना चाहता था प्रतिक्रिया.getEntity()। GetContent() चलाया जाता है, क्या यह कोई मुद्दा नहीं होगा जब बाद में मेरी मूल विधि में बयान चलाए जाएंगे? कृपया सलाह दें .. –

6

आप , HttpClient और HttpResponse उपहास करने के लिए हो सकता है अगर वे इंटरफेस रहे हैं (हालांकि, अपने पुस्तकालय के आधार पर आप MockHttpClient या MockHttpResponse इस्तेमाल कर सकते हैं), लेकिन आप और कुछ भी नहीं मजाक किया जाना चाहिए ।

क्यों?

नकली कक्षाओं पर अपेक्षित आउटपुट व्यवहार स्थापित कर रहा है जिसे हम कंक्रीट नहीं बना सकते हैं, या बल्कि कक्षाएं जिन्हें हम परीक्षण के इस विशेष उदाहरण के लिए एक निश्चित तरीके से व्यवहार करना चाहते हैं। आप यह सुनिश्चित करना चाहते हैं कि आपको एक नकली HttpClient से सही प्रतिक्रिया मिल जाए, और जब response.getEntity() कहा जाता है, तो यह एक सार्थक HttpEntity वापस देता है। आप इसे मजाक करने के लिए चुन सकते हैं या नहीं; मैं व्यक्तिगत रूप से नहीं करता, क्योंकि नकली कोई अतिरिक्त मूल्य नहीं जोड़ती है (शायद यह सत्यापित करने के अलावा कि एक विशेष विधि कहा जाता है)।

बाकी सब कुछ एक ठोस कार्यान्वयन है - आपको अन्य वस्तुओं को पहले मॉक किए गए तत्वों के परिणामों से बातचीत करने की इजाजत देनी चाहिए ताकि यह सुनिश्चित किया जा सके कि वे व्यवहार करते हैं जैसे कि कोई झटका नहीं होता।

असल में ... आप वास्तव में उनको नकल नहीं कर सकते जब तक कि आप उन्हें किसी भी तरह से पास नहीं करते या इंजेक्ट नहीं करते। मैं दृढ़ता से उस विधि में किसी भी new एड ऑब्जेक्ट्स को नकली करने का प्रयास करने से आपको हतोत्साहित करता है।

आप जो भी जोर दे रहे हैं उसे निर्दिष्ट नहीं करते हैं, लेकिन मुझे उम्मीद है कि यह आपकी क्षमता JSONObject है। मैं जोर देकर कहूंगा कि आपको इसमें क्या रखा जाने की उम्मीद है, वास्तव में इसे JSON ऑब्जेक्ट में बनाया गया है, और यह भी सत्यापित करता है कि आपकी मजाकिया वस्तुओं को बुलाया गया था और जिस तरह से आप उन्हें उम्मीद करते थे।

आपका एनोटेशन @Mock व्यापक नहीं है, जिस तरह से - आप @Mock के साथ सभी मज़ाक उड़ाया क्षेत्रों व्याख्या करने के लिए है, तो या तो @RunWith(MockitoJunitRunner.class) के साथ परीक्षण वर्ग पर टिप्पणी, या MockitoAnnotation.initMocks(this) (एक या अन्य का उपयोग किया है, दोनों को छोड़कर की आवश्यकता नहीं है किनारे के मामलों)। यदि आप एनोटेशन चुनते हैं, तो अपने परीक्षण ऑब्जेक्ट पर @InjectMocks को न भूलें।

आखिरकार, आपकी when स्थितियां जो मैं उन्हें करने की अपेक्षा करता हूं - वे ठीक होना चाहिए।

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