2011-06-23 10 views
6

मैं इस समय मॉकिटो सीख रहा हूं और मेरी सीख को मजबूत करने के लिए मैं जो कुछ कर रहा हूं, वह एक पुराने जुनीट टेस्ट को हाथ से लुढ़का हुआ नकली वर्ग का उपयोग करने से बदल रहा है जो इसके बजाय मॉकिटो मैक्स का उपयोग करता है। हालांकि, मैंने एक परिस्थिति में भाग लिया है, मुझे यकीन नहीं है कि कैसे संभालना है।क्या मॉकिटो मॉक ऑब्जेक्ट को पास किए गए तर्कों के खिलाफ पूछना संभव है?

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

मेरा पुराना हाथ लुढ़का हुआ मॉक क्लास उस परीक्षा को संग्रहीत करेगा जो मैं अपने परीक्षण में पूछ सकता हूं। यह मैं निम्नलिखित के माध्यम से शुरू करने और String के अंत क्वेरी करने के लिए अनुमति दी:

assertTrue(mockFtpClient.getFilePathAndName().startsWith("/data/inbound/XJSLGG.")); 
assertTrue(mockFtpClient.getFilePathAndName().endsWith(".pdf")); 

यह मेरा स्वाद के लिए एक पर्याप्त पर्याप्त परीक्षण किया गया था। तो मेरा सवाल यह है कि क्या मॉकिटो को क्वेरी करने या किसी विधि को पारित तर्कों को पकड़ने के लिए संभव है ताकि मैं उपरोक्त के समान कुछ कर सकूं?

अद्यतन 24/06/2011: इस बिंदु पर मैंने गॉन के जवाब को छोड़ दिया है। हालांकि, मैंने तब से कुछ खोजा है जो मेरे लिए बेहतर काम करता है। अर्थात् ArgumentCaptor। यहाँ यह कैसे काम करता है:

ArgumentCaptor<String> fileNameArgument = ArgumentCaptor.forClass(String.class); 
verify(mockFtpClient).putFileOnServer(fileNameArgument.capture()); 
assertTrue(fileNameArgument.getValue().startsWith(START_FILE_NAME) && 
      fileNameArgument.getValue().endsWith(END_FILE_NAME)); 

Mockito राज्य के लिए जावाडोक कि ArgumentCaptor आम तौर पर एक बेहतर विकल्प है कि आप एक बंद विशिष्ट तर्क मिलान आवश्यकता है जब, के रूप में मैं यहाँ से करते हैं।

+1

अद्यतन के लिए धन्यवाद, मुझे ArgumentCaptor के बारे में पता नहीं था। –

+0

ArgumentCaptor मेरे (कोडिंग) जीवन को बदलने जा रहा है! –

उत्तर

3

मूल रूप से आप argThat() Mockito में, तो आपको सत्यापन तर्क के रूप में एक Hamcrest Matcher इलाज देता है कि उपयोग करने के लिए की जरूरत है।

@Test 
public void testname() throws Exception { 
    HashReceiver receiver = mock(HashReceiver.class); 
    receiver.set("hash"); 
    verify(receiver).set(argThat(new HashMatcher())); 
} 

class HashMatcher extends BaseMatcher<String> { 
    @Override 
    public boolean matches(Object item) { 
     String hash = (String) item; 
     if (hash.startsWith("/data/inbound/XJSLGG.") && hash.endsWith(".pdf")) 
      return true; 
     return false; 
    } 
} 

// Mocked 
class HashReceiver { 
    public void set(String hash) { 
    } 
} 

आप के बजाय एक सामान्य मिलान उपयोग करने में सक्षम हो सकता है, या सामान्य matchers का एक संयोजन: यहाँ कोड यदि आप एक से पारित कर दिया-में बहस के बारे में कस्टम दावे बनाने के लिए इस्तेमाल करते हैं।

+0

धन्यवाद गॉन, मुझे लगता है कि यह समाधान मुझे जो चाहिए वह वास्तव में अच्छा काम करता है। इसे इतना अतिरिक्त कोड शर्मिंदा करें, लेकिन फिर यह एक आम परिदृश्य नहीं है। –

+0

यह वह जगह है जहां आपको argThat() विधि मिलेगी: http://docs.mockito.googlecode.com/hg/latest/org/mockito/Matchers.html#argThat(org.hamcrest.Matcher)। आपका आयात 'स्थिर स्थैतिक संगठन होना चाहिए। Mockito.Matchers.argThat;' –

1

इस प्रश्न के स्वीकृत उत्तर पर एक नज़र डालें mockito-how-to-make-a-method-return-an-argument-that-was-passed-to-it यह आपको दिखाएगा कि आपके नकली विधि आमंत्रण में दिए गए तर्कों को कैसे प्राप्त किया जाए।

+0

खराब नहीं है, लेकिन इनपुट पैरामीटर को पकड़ने के लिए उत्तर ऑब्जेक्ट का उपयोग करना मेरे लिए थोड़ा सा पीछे लगता है और मुझे पूरी तरह से यकीन नहीं है कि यह मेरे शून्य विधि हस्ताक्षर के साथ काम करेगा। हालांकि धन्यवाद! मुझे पहले 'उत्तर' के बारे में पता नहीं था। –