2012-09-14 14 views
10

मैं अपने आवेदन के लिए यूनिट परीक्षण लिख रहा हूं और मैं सोच रहा था कि मॉकिटो फ्रेमवर्क के लिए एक ऐसी विधि को प्रभावित करने के लिए संभव है जो किसी मॉक क्लास से रहित हो । उदाहरण के लिए, एक मॉक किए गए सत्यापन वर्ग को कॉल करना जिसमें एक विधि है जो शून्य लौटाती है लेकिन तर्क के रूप में पारित ऑब्जेक्ट के माध्यम से विभिन्न परिवर्तनों और मेटाडेटा को ट्रैक करती है। ।किसी ऑब्जेक्ट को प्रभावित करने वाली शून्य वापसी विधि को कैसे नकल करें

public GetCartItemsOutput getCartItems(GetCartItemsInput getCartItemsInput) { 
    CartItemsFilter cartItemsFilter = new CartItemsFilter(); 
    validator.validateCartItemsInput(getCartItemsInput, cartItemsFilter); ... 

मैं अपने अन्य परीक्षण के लिए सत्यापनकर्ता वर्ग मज़ाक उड़ाया लेकिन इस एक के लिए मैं cartItemsFilter वस्तु जो मैं करना चाहता हूँ पता नहीं कैसे करने के लिए परिवर्तन नकली की जरूरत है।

उत्तर

18

उत्तर हाँ है, आप कर सकते हैं, और मूल रूप से आपके परीक्षण की आवश्यकता के आधार पर ऐसा करने के दो स्तर हैं।

यदि आप केवल मॉक ऑब्जेक्ट के साथ बातचीत का परीक्षण करना चाहते हैं, तो आप सत्यापित करने के लिए कि विधि विधि कहलाती है, आप बस verify() विधि का उपयोग कर सकते हैं।

अपने परीक्षण वास्तव में यह करने के लिए पारित किया पैरामीटर को बदलने मज़ाक उड़ाया वस्तु की जरूरत है, तो आप एक Answer लागू करने के लिए की आवश्यकता होगी:

संपादित शून्य विधि के साथ उत्तर का उपयोग करने का उचित रूप को दिखाने के लिए

doAnswer(new Answer() { 
    Object answer(InvocationOnMock invocation) { 
     Object[] args = invocation.getArguments(); 
     ((MyClass)args[0]).myClassSetMyField(NEW_VALUE); 
     return null; // void method, so return null 
    } 
}).when(mock).someMethod(); 
+0

आपकी मदद के लिए धन्यवाद। मेरे सिर को लपेटने के लिए मुझे थोड़ी देर लग गई "((MyClass) args [0])। MyClassSetMyField (NEW_VALUE);", लेकिन अंततः मुझे पता चला कि बिंदु मेरी मैक विधि में पारित तर्क के पैरामीटर सेट करना था। फिर, टाई। – tamuren

0

ArgumentCaptor भी मदद कर सकता है। यदि आपका MyClass, एक कस्टम वर्ग है तो उस में एक बराबर/hashCode विधि को परिभाषित

ArgumentCaptor<GetCartItemsInput > argument = ArgumentCaptor.forClass(GetCartItemsInput .class); 
    verify(mock).getCartItems(argument.capture()); 
    assertEquals(cartItemsFilter, argument.getValue()); 
+1

यह ओप की समस्या को हल नहीं करता है, उसे उत्तर लागू करने की आवश्यकता है – iwein

1

केविन Welker का जवाब, को जोड़ने के लिए, ताकि Mockito इसका इस्तेमाल कर सकते हैं:

यहाँ एक टुकड़ा here से मिला विधि कॉल से बिल्कुल मिलान करने के लिए।

मेरे मामले में, "MyClass" एक तीसरे पक्ष एपीआई में था, इसलिए मैं विधि "किसी भी" के रूप में नीचे का इस्तेमाल किया था -

doAnswer(new Answer() { 
    Object answer(InvocationOnMock invocation) { 
     Object[] args = invocation.getArguments(); 
     ((MyClass)args[0]).myClassSetMyField(NEW_VALUE); 
     return null; // void method, so return null 
    } 
}).when(mock).someMethod(any(MyClass.class)); 
संबंधित मुद्दे

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