2009-02-04 16 views
42

के बाद कुछ भी नहीं कहा जाता है, मैं जावा में यूनिट परीक्षण लिखने के लिए मॉकिटो का उपयोग कर रहा हूं, और मैं यह सत्यापित करना चाहता हूं कि एक निश्चित विधि एक ऑब्जेक्ट पर कॉल की गई एक है।यह सत्यापित करने के लिए मॉकिटो का उपयोग करें कि विधि

मैं परीक्षण के अंतर्गत कोड में कुछ इस तरह कर रहा हूँ:

row.setSomething(value); 
row.setSomethingElse(anotherValue); 
row.editABunchMoreStuff(); 
row.saveToDatabase(); 

मेरी नकली में, मैं जिस क्रम में मैं पंक्ति पर सब कुछ संपादित के बारे में परवाह नहीं है, लेकिन यह है कि बहुत महत्वपूर्ण है I इसे सहेजने के बाद इसे और कुछ करने का प्रयास करें। क्या ऐसा करने का कोई अच्छा तरीका है?

ध्यान दें कि मैं सत्यापित नहीं कर रहा हूं NoMoreInteractions: यह पुष्टि नहीं करता है कि saveToDatabase को आखिरी चीज़ कहा जाता है, और यह भी विफल रहता है अगर मैं उस पंक्ति पर कुछ भी कहता हूं जिसे मैं स्पष्ट रूप से सत्यापित नहीं करता हूं। इसे और अधिक कस्टम की आवश्यकता है

row.expects(once()).method("saveToDatabase").id("save"); 
row.expects(never()).method(ANYTHING).after("save"); 
+5

एक नोट: हम अंत में इस पुनर्संशोधित आदेश निर्भरता से बचने के लिए। विशेष रूप से, हमने saveToDatabase() भाग को कोड की बाहरी परत में ले जाया, जहां इसे सही समय पर स्वचालित रूप से कॉल किया जाएगा। आम तौर पर, यदि आपको किसी नकली के साथ ऐसा कुछ करने की ज़रूरत है, तो आपके परीक्षण आपको रिफैक्टर करने के लिए कह रहे हैं। उस ने कहा, अभी भी एक परीक्षण करना अच्छा है जो डिजाइन तब तक काम कर सकता है जब तक कि डिज़ाइन बदल नहीं जाता है। –

उत्तर

52

मुझे लगता है कि:

verify(row).setSomething(value); 
verify(row).setSomethingElse(anotherValue); 
verifyTheLastThingCalledOn(row).saveToDatabase(); 

यदि यह मदद करता है, मैं एक JMock परीक्षण है कि ऐसा किया से Mockito का उपयोग करने जा रहा हूँ: मैं की तरह कुछ कहने में सक्षम होना चाहते हैं काम।

verify(row, new LastCall()).saveToDatabase(); 

और फिर

public class LastCall implements VerificationMode { 
    public void verify(VerificationData data) { 
     List<Invocation> invocations = data.getAllInvocations(); 
     InvocationMatcher matcher = data.getWanted(); 
     Invocation invocation = invocations.get(invocations.size() - 1); 
     if (!matcher.matches(invocation)) throw new MockitoException("..."); 
    } 
} 

पिछला उत्तर:

आप ठीक कह रहे हैं। सत्यापित करेंअनोर इंटरैक्शन वह है जो आपको चाहिए।

verify(row).setSomething(value); 
verify(row).setSomethingElse(anotherValue); 
verify(row).editABunchMoreStuff(); 
verify(row).saveToDatabase(); 
verifyNoMoreInteractions(row); 
+0

नहीं, यह नहीं है। मैंने स्पष्ट करने के लिए सवाल क्यों अपडेट किया है। –

+0

ओह वाह। जब तक मैं पुराने प्रश्नों की समीक्षा नहीं कर रहा था तब तक मैं आपके अपडेट को याद कर दूंगा, अन्यथा मैं इसे जल्द से जल्द उठा दूंगा। ऐसा लगता है कि मुझे बिल्कुल क्या चाहिए। धन्यवाद! –

+1

संकलन त्रुटि: हल नहीं किया जा सकता – kmalmur

0

यह सवाल JMockit (आगामी रिलीज 0.983 में उपलब्ध) में सत्यापन एपीआई के लिए कुछ संवर्द्धन बनाने के लिए मुझे का नेतृत्व किया।

समाधान (एक परीक्षा पद्धति में) मैं आया तुम लिखने के लिए अनुमति देता है के साथ:


    new VerificationsInOrder() {{ 
     unverifiedInvocations(); 
     row.saveToDababase(); 
    }}; 

... आप केवल सत्यापित करने के लिए एक निश्चित विधि सब कुछ के बाद कहा जाता है चाहते हैं। यह सत्यापित करने के लिए से पहले अन्य सभी आमंत्रण होता है, बस कॉल को शीर्ष पर ले जाएं। यह वास्तव में लगातार आमंत्रण के किसी अनुक्रम पर लागू होता है।

यदि उपर्युक्त सत्यापन के अतिरिक्त, आप यह भी सत्यापित करना चाहते हैं कि किसी अन्य क्रम में कुछ अन्य विधियों को बुलाया जाता है, तो दूसरा सत्यापन ब्लॉक को परीक्षण में जोड़ा जा सकता है (अन्य ब्लॉक से पहले या बाद में, यह ' टी पदार्थ):


    new Verifications() {{ 
     row.setSomething(value); 
     row.setSomethingElse(anotherValue); 
    }}; 

हालांकि अनाम आंतरिक कक्षाओं के उपयोग के कारण थोड़ा लंबा, यह वाक्यविन्यास सरल और लचीला दोनों है; ध्यान दें कि यह परीक्षण में संरचना को कैसे जोड़ता है और विधि कॉल की पुनरावृत्ति से बचाता है (जैसे verify(...))। यहां वर्णित की तुलना में इसके लिए और भी कुछ है (हैमक्रिस्ट मैचर्स, इनवोकेशन मायने रखता है, आदि), और यह आवृत्ति विधियों के सत्यापन तक ही सीमित नहीं है (स्थैतिक विधियों और रचनाकारों को उसी तरह से मजाक और सत्यापित किया जा सकता है)।

9

विषय पर 100% नहीं, लेकिन मैं सिर्फ सत्यापित करने के विपरीत खोजने के लिए देख रहा था, और यह एकमात्र प्रासंगिक परिणाम था, यह समाप्त होता है मैं मैकिटो के बाद था।verifyZeroInteractions (नकली);

बस बैठाना किसी और को यहाँ समाप्त होता है भविष्य से इस की तलाश में ...

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