यह कैसे सत्यापित करें कि एक विशिष्ट विधि को मॉकिटो का उपयोग करके नहीं बुलाया गया था?


625

यह कैसे सत्यापित करें कि किसी विधि को किसी वस्तु की निर्भरता पर नहीं कहा जाता है?

उदाहरण के लिए:

public interface Dependency {
    void someMethod();
}

public class Foo {
    public bar(final Dependency d) {
        ...
    }
}

फू परीक्षण के साथ:

public class FooTest {
    @Test
    public void dependencyIsNotCalled() {
        final Foo foo = new Foo(...);
        final Dependency dependency = mock(Dependency.class);
        foo.bar(dependency);
        **// verify here that someMethod was not called??**
    }
}

जवाबों:


1087

और भी सार्थक:

import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

// ...

verify(dependency, never()).someMethod();

इस सुविधा का दस्तावेज़ीकरण is4 "सही संख्या में इनवोकेशन / कम से कम x / never" सत्यापित करना है , और neverjavadoc यहाँ है


144
का उपयोग करना neverसबसे अच्छा और सबसे विशिष्ट तरीका है, लेकिन अगर आपको संपूर्ण नकली वस्तु की जांच करने की आवश्यकता है, तो भी विचार करें verifyZeroInteractions(mockObject)या verifyNoMoreInteractions(mockObject)
जेफ बोमन

अगर कुछ मैथोड निजी है तो क्या करें ??
सुमित कुमार साहा

1
तब आप इसे पहली बार (मॉकिटो के साथ) मॉक नहीं कर सकते हैं;) पॉवरमॉक इसकी अनुमति देता है लेकिन इसे स्थापित करना अधिक जटिल है। या यदि आपके पास कोड का स्वामित्व है, तो आप दृश्यता को पैकेज में शिथिल कर देते हैं।
ब्रिस्स

2
3.0.1 के बाद verifyZeroInteractionsसे पदावनत कर दिया गया है। verifyNoInteractions सुझाया गया विकल्प है। इस टिप्पणी के समय मॉकिटो संस्करण 3.3.3
वीकेबी

108

Mockito.verifyविधि पर दूसरे तर्क का उपयोग करें , जैसे:

verify(dependency, Mockito.times(0)).someMethod()


11
सार्वजनिक स्थैतिक सत्यापन मोड कभी नहीं () {रिटर्न बार (0); }
gbero

3
never()से अधिक पठनीय नहीं है times(0)। लेकिन का अस्तित्व neverसंज्ञानात्मक भार को बढ़ाता है और मॉकिटो प्रणाली को समझने और याद रखने के लिए कठिन बनाता है कि कैसे उपयोग किया जाए। तो वास्तव में मॉकिटो को neverउनके एपीआई में शामिल नहीं होना चाहिए , इसकी मानसिक लागत नहीं है।
बीटी

प्रश्न: क्या यह फ़ॉर्म सत्यापित करता है someMethodजिसे 0 बार कहा गया था, या क्या यह केवल यह सत्यापित करता है कि someMethodशून्य तर्क के साथ कभी नहीं बुलाया गया था?
बीटी

@ बीटी - मुझे लगता है कि यह पुष्टि करता है कि someMethodशून्य तर्कों को शून्य समय कहा जाता है- सत्यापित नहीं।
बेलुचिन

18

पालन ​​करने के लिए एक अधिक सामान्य पैटर्न के रूप में, मैं @Afterपरीक्षण में एक ब्लॉक का उपयोग करता हूं :

@After
public void after() {
    verifyNoMoreInteractions(<your mock1>, <your mock2>...);
}

फिर परीक्षण केवल यह सत्यापित करने के लिए स्वतंत्र है कि क्या कहा जाना चाहिए।

इसके अलावा, मैंने पाया कि मैं अक्सर "कोई बातचीत नहीं" के लिए जांच करना भूल गया, केवल बाद में पता चलता है कि चीजों को बुलाया जा रहा था जो नहीं होना चाहिए था।

इसलिए मुझे यह पैटर्न उन सभी अप्रत्याशित कॉलों को पकड़ने के लिए उपयोगी लगता है, जिन्हें विशेष रूप से सत्यापित नहीं किया गया है।


9
मॉकिटो प्रलेखन में कहा गया है कि इस पैटर्न का दुरुपयोग नहीं किया जाना चाहिए - "चेतावनी का एक शब्द: कुछ उपयोगकर्ता जिन्होंने बहुत से क्लासिक, उम्मीद-रन-वेरीफाइड मॉकिंग करते हैं वे VerNoMoreInteractions () का उपयोग बहुत बार करते हैं, यहां तक ​​कि हर परीक्षण विधि में भी। VerNoMoreInteractions। () प्रत्येक परीक्षण पद्धति में उपयोग करने की अनुशंसा नहीं की जाती है। सहभागिता परीक्षण टूलकिट से VerNoMoreInteractions () एक आसान दावा है। इसका उपयोग केवल तब करें जब यह प्रासंगिक हो। इसका दुरुपयोग करने से यह कम परीक्षण योग्य हो जाता है। " यहां
चादी

2
"प्रासंगिक होने पर ही इसका उपयोग करें"। मुझे लगता है कि यह हमेशा प्रासंगिक है। मैं उस पैटर्न को दुरुपयोग के रूप में नहीं देखता: जैसा कि मैंने कहा, यह पाता है "चीजों को बुलाया जा रहा था जो नहीं होना चाहिए था"। मेरे लिए, यह सत्यापन का एक महत्वपूर्ण टुकड़ा है: यदि कोई ऐसा भंडार भेज रहा है जिसका उपयोग नहीं किया जाना चाहिए, तो मैं उसके बारे में जानना चाहता हूं! जब तक कि उपयोग किए बिना यह सत्यापित करने का एक और तरीका नहीं है verifyNoMoreInteractions? यहाँ अन्य उत्तर स्पष्ट रूप से इन चेकों को सूचीबद्ध करने के लिए याद रखने वाले परीक्षण लेखक पर निर्भर करते हैं: यह मेरी पुस्तक में बहुत अधिक त्रुटि है।
डेविड लैवेंडर

2
मैंने इस टिप्पणी को देखा, लेकिन यह भी महसूस किया कि तर्क सम्मोहक नहीं था। मुझे इस बारे में अधिक पढ़ना पसंद होगा कि यह क्यों अनुशंसित नहीं है।
tobinibot

2
@tobinibot क्योंकि यूनिट परीक्षण का विचार एक अनुबंध को सत्यापित करना है। अधिकांश अनुबंधों में आम तौर पर शामिल नहीं होता है कि किसी अन्य विधि को कितनी बार लागू किया जाता है, बल्कि यह कि ज्ञात मापदंडों में गुजरने पर एक ज्ञात प्रतिक्रिया होती है। कोई और इंटरैक्शन का उपयोग करके आप मूल रूप से लाइन द्वारा कार्यान्वयन लाइन का सत्यापन कर रहे हैं, जो कि रिफैक्टिंग और कार्यान्वयन थकाऊ बनाता है। जो इकाई परीक्षण की बात नहीं है।
एंड्रयू टी फिननेल

8

सबसे पहले: आपको हमेशा मॉकिटो स्थैतिक आयात करना चाहिए, इस तरह से कोड बहुत अधिक पठनीय (और सहज) होगा:

import static org.mockito.Mockito.*;

वास्तव में इसे प्राप्त करने के कई तरीके हैं, हालांकि इसका उपयोग करने के लिए (यकीनन) क्लीनर है

verify(yourMock, times(0)).someMethod();

अपने सभी परीक्षणों की विधि, जब अन्य परीक्षणों पर आप इस तरह के निष्पादन की एक निश्चित राशि का दावा करने के लिए इसका उपयोग करते हैं:

verify(yourMock, times(5)).someMethod();

विकल्प हैं:

verify(yourMock, never()).someMethod();

वैकल्पिक रूप से - जब आप वास्तव में यह सुनिश्चित करना चाहते हैं कि एक निश्चित नकली वस्तु वास्तव में बिलकुल नहीं है - आप इसका उपयोग कर सकते हैं:

verifyZeroInteractions(yourMock)

7

आंतरिक verifyNoMoreInteractions()और verifyZeroInteractions()विधि दोनों में समान रूप से कार्यान्वयन है:

public static transient void verifyNoMoreInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

public static transient void verifyZeroInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

इसलिए हम उनमें से किसी एक का उपयोग कर सकते हैं नकली वस्तु या नकली वस्तुओं की सरणी पर यह जांचने के लिए कि किसी भी तरीके को नकली वस्तुओं का उपयोग करके नहीं बुलाया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.