मॉकिटो कॉलबैक और तर्क मूल्य प्राप्त करना


88

मुझे फंक्शन लॉजिक वैल्यू पर कब्जा करने के लिए मॉकिटो मिलने का कोई सौभाग्य नहीं है! मैं एक सर्च इंजन इंडेक्स का मजाक उड़ा रहा हूं और एक इंडेक्स बनाने के बजाय, मैं सिर्फ एक हैश का उपयोग कर रहा हूं।

// Fake index for solr
Hashmap<Integer,Document> fakeIndex;

// Add a document 666 to the fakeIndex
SolrIndexReader reader = Mockito.mock(SolrIndexReader.class);

// Give the reader access to the fake index
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))

मैं मनमाने तर्कों का उपयोग नहीं कर सकता क्योंकि मैं प्रश्नों के परिणामों का परीक्षण कर रहा हूं (अर्थात वे कौन से दस्तावेज़ वापस करते हैं)। इसी तरह, मैं एक विशिष्ट मूल्य निर्दिष्ट नहीं करना चाहता और प्रत्येक दस्तावेज़ के लिए एक पंक्ति है!

Mockito.when(reader.document(0)).thenReturn(document(fakeIndex(0))
Mockito.when(reader.document(1)).thenReturn(document(fakeIndex(1))
....
Mockito.when(reader.document(n)).thenReturn(document(fakeIndex(n))

मैंने यूजिंग मॉकिटो पृष्ठ पर कॉलबैक अनुभाग को देखा । दुर्भाग्य से, यह जावा नहीं है और मैं जावा में काम करने के लिए अपनी खुद की व्याख्या नहीं कर सका।

EDIT (स्पष्टीकरण के लिए): मैं एक तर्क X पर कब्जा करने और इसे अपने कार्य में पास करने के लिए मॉकिटो कैसे प्राप्त कर सकता हूं? मैं फ़ंक्शन के लिए एक्स का सटीक मान (या रेफ) चाहता हूं।

मैं सभी मामलों की गणना नहीं करना चाहता हूं, और मनमानी तर्क काम नहीं करेगा क्योंकि मैं अलग-अलग प्रश्नों के लिए अलग-अलग परिणामों के लिए परीक्षण कर रहा हूं।

मॉकिटो पृष्ठ कहता है

val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString } 

यह जावा नहीं है, और मुझे नहीं पता कि जावा में कैसे अनुवाद किया जाए या जो कुछ भी हुआ वह एक समारोह में पारित हो।


मुझे यकीन नहीं है कि मैं समझ पा रहा हूं कि आपके लिए क्या असफल है। आपकी कॉल को आपके Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))लिए मॉक ऑब्जेक्ट सेटअप करना चाहिए। जब आप कॉल करते हैं तो क्या होता है reader.document(666)?

666 ठीक काम करता है। हालाँकि, मैं एक विशिष्ट संख्या X में पास होना चाहता हूँ और नकली परिणाम (X) प्राप्त करना चाहता हूँ। मेरे पास प्रश्नों के परीक्षण के लिए बड़ी संख्या में संभावित डॉक्स हैं, और मैं उन सभी को दर्ज नहीं करना चाहता।
nflacco

जवाबों:


103

मैंने कभी भी मॉकिटो का उपयोग नहीं किया है, लेकिन मैं सीखना चाहता हूं, इसलिए यहां जाता है। अगर कोई मुझसे कम जवाब देता है, तो पहले उसका जवाब आज़माएं!

Mockito.when(reader.document(anyInt())).thenAnswer(new Answer() {
 public Object answer(InvocationOnMock invocation) {
     Object[] args = invocation.getArguments();
     Object mock = invocation.getMock();
     return document(fakeIndex((int)(Integer)args[0]));
     }
 });

2
मैंने अभी मॉकिटो के दाईं ओर लिंक पर ध्यान दिया : कैसे एक विधि को एक तर्क वापस करने के लिए जो इसे पारित किया गया था । लगता है कि मैं करीब हूं, अगर हाजिर नहीं हुआ।
एड स्टब

मूल प्रश्न सहसंबंध के लिए मजबूत उपयोगकर्ता प्रतिष्ठा (666)! यह बहुत अच्छा काम किया। केवल सामान संकलन करने के लिए मैंने जो परिवर्तन किया, वह वस्तु के उत्तर के सामने सार्वजनिक रूप से रखा गया था (InvocationOnMock मंगलाचरण) ....
nflacco

54

ArgumentCaptors देखें:

https://site.mockito.org/javadoc/current/org/mockito/ArgumentCaptor.html

ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
Mockito.when(reader.document(argument.capture())).thenAnswer(
  new Answer() {
    Object answer(InvocationOnMock invocation) {
      return document(argument.getValue());
    }
  });

3
वाह, मुझे नहीं पता था कि आप ArgumentCaptorस्टबिंग के लिए एस का उपयोग कर सकते हैं । उस लिंक में हालांकि इसके बारे में एक बड़ा राजभाषा चेतावनी है। सावधानी के साथ आगे बढ़ें।
einnocent

3
हाँ, तुम सही हो। कैप्शन का उपयोग केवल सत्यापन के साथ किया जाना चाहिए।
क्वालिडैफियल

41

परीक्षण में निष्पादन और तर्क का मूल्यांकन करने के लिए तर्क को सुनिश्चित करने के लिए आप ArgumentCaptor के साथ संयोजन में सत्यापन () का उपयोग करना चाह सकते हैं:

ArgumentCaptor<Document> argument = ArgumentCaptor.forClass(Document.class);
verify(reader).document(argument.capture());
assertEquals(*expected value here*, argument.getValue());

तर्क का मूल्य स्पष्ट रूप से तर्क के माध्यम से सुलभ है। आगे के हेरफेर / जाँच या आप जो भी करना चाहते हैं, उसके लिए।


2
सबसे अच्छा जवाब: सीधे आगे, समझने में आसान
Radu Cugut

सवाल का जवाब नहीं देता। प्रश्न Mockito.when के बारे में है और सत्यापित नहीं है।
seBaka28

@ seBaka28 तर्कों को प्राप्त करने का सबसे अच्छा समाधान एक तर्क कैप्चर है। ArgumentCaptors को मॉकिटो के लेखकों द्वारा सत्यापन के साथ उपयोग करने की दृढ़ता से सलाह दी जाती है, इस प्रकार मैं पूर्ण परिप्रेक्ष्य उत्तर देना चाहता था। यदि आप अपने लिए चुनते हैं तो उनका उपयोग न करें, यह आपकी पसंद है, लेकिन सलाह नहीं। संपादित करें: मैं नहीं देखता कि यह कैसे एक औचित्य साबित करता है, लेकिन यह भी आपकी पसंद है।
fl0w

1
क्योंकि यह प्रश्न का उत्तर नहीं देता है। हाँ, ArgumentCaptor महान है जब आप तर्क को कैप्चर करना चाहते हैं, लेकिन आप इसे (...) के साथ संयोजन के रूप में उपयोग नहीं कर सकते हैं। तब पुन: प्रयास करें (जो कि ओपी करने की कोशिश कर रहा है: एक निश्चित पैरामीटर के आधार पर, एक मैप की गई सेवा पर आधारित है। किसी विशिष्ट वस्तु को वापस करना है।
seBaka28

1
@YuraHoy एक मानक त्रुटि संदेश है जब आप सत्यापन का उपयोग करते हैं और ऑब्जेक्ट या विधि को अपेक्षा से अधिक बार कहा जाता है, जबकि आपने सत्यापित किया था। आप निम्नानुसार समय (n) तर्क को जोड़कर अपेक्षा की गणना को बदल सकते हैं: सत्यापित करें (पाठक, समय (5)) - इससे अन्य इंटरैक्शन की उम्मीद होगी। संदर्भ के लिए कृपया देखें: baeldung.com/mockito-verify
fl0w

13

जावा 8 के साथ, यह कुछ इस तरह हो सकता है:

Mockito.when(reader.document(anyInt())).thenAnswer(
  (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));

मैं मान रहा हूं कि documentयह एक नक्शा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.