2012-05-31 16 views
24

पर किसी भी विधि मंगलाचरण यह एक सामान्य तरीके से एक नकली पर सभी विधि आमंत्रण रोकना संभव है अवरोधन?Mockito - एक नकली

उदाहरण

जैसे एक विक्रेता प्रदान की कक्षा को देखते हुए:

public class VendorObject { 

    public int someIntMethod() { 
     // ... 
    } 

    public String someStringMethod() { 
     // ... 
    } 

} 

मैं एक नकली है कि फिर से निर्देशन सभी विधि अन्य वर्ग जहां विधि वहाँ मिलान कर रहे हैं करने के लिए कॉल बनाना चाहेंगे हस्ताक्षर:

public class RedirectedToObject { 

    public int someIntMethod() { 
     // Accepts re-direct 
    } 

} 

कब()। तब Answers() construc Mockito में टी बिल फिट करने के लिए लगता है, लेकिन मैं एक तरह से किसी भी आर्ग के साथ किसी भी विधि कॉल मैच के लिए नहीं मिल रहा। InvocationOnMock निश्चित रूप से मुझे इन सभी विवरणों को वैसे भी देता है। क्या ऐसा करने का एक सामान्य तरीका है? कुछ है कि इस है, जहां जब उचित कोड साथ बदल दिया है की तरह लग रहे हैं (VO *।):

VendorObject vo = mock(VendorObject.class); 
when(vo.anyMethod(anyArgs)).thenAnswer(
    new Answer() { 
     @Override 
     public Object answer(InvocationOnMock invocation) { 

      // 1. Check if method exists on RedirectToObject. 
      // 2a. If it does, call the method with the args and return the result. 
      // 2b. If it does not, throw an exception to fail the unit test. 

     } 
    } 
); 

विक्रेता वर्गों के आसपास जोड़ना रैपर आसान मजाक बनाने के लिए एक विकल्प नहीं है क्योंकि:

  1. एक मौजूदा कोड बेस बहुत बड़ा है।
  2. अत्यंत प्रदर्शन महत्वपूर्ण अनुप्रयोगों का एक हिस्सा।
+0

मुझे बताओ यह रूप में सरल है, जब (VO) .thenAnswer (...): हे – Karle

+0

'बेहद प्रदर्शन महत्वपूर्ण अनुप्रयोगों का एक हिस्सा। " नकली/प्रॉक्सी ऑब्जेक्ट को इस मामले में एक रैपर जोड़ने से अलग कैसे जोड़ रहा है? क्या आप इसे केवल इकाई परीक्षण, या वास्तविक ऐप में करने में रुचि रखते हैं? –

+0

@mattb: प्रदर्शन पहलू आवरण वर्गों का उपयोग के खिलाफ सबसे बड़ी तर्क नहीं है। हम मूल विक्रेता वस्तु और एक कार्यान्वयन वर्ग है कि वास्तविक विक्रेता वस्तु के लिए अनुरोध अग्रेषित करता है के आधार पर एक इंटरफ़ेस बनाने चाहते हैं। इसके लिए निष्पादन समय वास्तविक विक्रेता ऑब्जेक्ट की तुलना में छोटा होने जा रहा है। अधिक महत्वपूर्ण तर्क विक्रेता ऑब्जेक्ट का उपयोग कर मौजूदा कोड बेस है। – Karle

उत्तर

39

मुझे लगता है कि क्या आप चाहते हैं:

VendorObject vo = mock(VendorObject.class, new Answer() { 
    @Override 
    public Object answer(InvocationOnMock invocation) { 

     // 1. Check if method exists on RedirectToObject. 
     // 2a. If it does, call the method with the args and return the 
     // result. 
     // 2b. If it does not, throw an exception to fail the unit test. 

    } 
}); 
बेशक

, आप बार-बार इस दृष्टिकोण का उपयोग करना चाहते हैं, गुमनाम रहना उत्तर के लिए कोई जरूरत नहीं।

documentation से: "यह काफी उन्नत सुविधा है और आम तौर पर आपको सभ्य परीक्षण लिखने की आवश्यकता नहीं होती है। हालांकि विरासत प्रणाली के साथ काम करते समय यह सहायक हो सकता है।" आपके जैसा लगता है।

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