2011-04-08 15 views
9

साथ शुरू हो जाती है कि क्या मैं तीन तरीकों इन लोगों की तरह है:सत्यापित करें तीन तरीकों में से एक mockito

public void method1(String str){ 
    ... 
} 

public void method1(String str, String str2, String str3){ 
    ... 
} 

public void method1(String str, String str2, Object[] objs, String str3){ 
    ... 
} 

मैं Mockito में जांच करने के लिए करता है, तो इनमें से किसी भी लागू कर रहे हैं चाहते हैं, तो मैं उपयोग करने के लिए कोशिश की है anyVararg Matcher:

verify(foo).method1(anyVararg()); 

लेकिन इस संकलन नहीं है

"प्रकार त्रुटियाँ में विधि Method1 (स्ट्रिंग, स्ट्रिंग) तर्कों (वस्तु) के लिए लागू नहीं है" मैं दो प्रश्न हैं:

  1. मैं इसे कैसे हल कर सकता हूं?
  2. क्या यह जांचने का कोई तरीका है कि दो तरीकों में से कोई भी लागू किया गया है या नहीं? कल्पना कीजिए कि मेरे पास method2 और method3 नामक एक और गणित है। मैं यह जांचना चाहता हूं कि उनमें से कोई भी आविष्कार किया गया है (लेकिन कम से कम एक)।

धन्यवाद।

उत्तर

2

एक vararg विधि इस तरह एक हस्ताक्षर है:

public void myMethod(String ... arguments){} 

अपने तरीकों में से कोई भी एक vararg तरीका है।

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

+0

ओह ठीक है धन्यवाद, मैंने http://docs.mockito.googlecode.com/hg/org/mockito/Matchers.html#anyVararg() पर उदाहरण को गलत समझा है क्या यह जांचने के लिए कुछ भी है कि इनमें से कोई भी तरीका लागू किया गया है या नहीं? – Juanillo

7

यदि आप किसी भी विधि को कॉल करते हैं तो काउंटर बढ़ाने के लिए आप Answer का उपयोग कर ऐसा कर सकते हैं।

private Answer incrementCounter = new Answer() { 
    public Object answer(InvocationOnMock invocation) throws Throwable { 
     counter++; 
     return null; 
    }   
}; 

ध्यान दें कि आप सभी तरीकों ठूंठ की जरूरत है। एक विधि की विशिष्टता इसके हस्ताक्षर पर आधारित होती है न केवल विधि का नाम। एक ही नाम के साथ दो विधियां अभी भी दो अलग-अलग विधियां हैं। doAnswerhere के लिए

doAnswer(incrementCounter).when(mockObj.method1(anyString())); 
doAnswer(incrementCounter).when(mockObj.method1(anyString(), anyString())); 
doAnswer(incrementCounter).when(mockObj.method2(anyString())); 

दस्तावेज़ देखें।

+0

DoAswer विधि क्या है, क्या यह मॉकिटो का हिस्सा है? –

+1

@AbdenaceurLichiheb हां यह स्थैतिक विधि 'org.mockito.Mockito.doAnswer' है –

0

आप इस जवाब में की तरह वस्तु पर सभी कॉल्स को इंटरसेप्ट कर सकते हैं: Mockito - intercept any method invocation on a mock और फिर डाल दृष्टिकोण @Bozho ने सुझाव दिया के साथ इस गठबंधन:

private Answer incrementCounter = new Answer() { 
    public Object answer(InvocationOnMock invocation) throws Throwable { 
     if (invocation.getMethod().getName().eqauls("someMethid")) { 
      counter++; 
     } 
     return null; 
    }   
}; 

VendorObject mockObj = mock(SomeClass.class, incrementCounter); 

नोट: यदि आप इस से किसी भी विधि के लिए अन्य इंटरसेप्टर प्रदान करता है, तो - डिफ़ॉल्ट नहीं किया जाएगा।

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