क्या मॉकिटो तर्क की परवाह किए बिना एक विधि को रोक सकता है?


302

मैं मॉकिटो का उपयोग करके कुछ विरासत कोड का परीक्षण करने की कोशिश कर रहा हूं।

मैं चाहता हूँ FooDaoकि उत्पादन में प्रयोग किया जाता है कि ठूंठ के रूप में इस प्रकार है:

foo = fooDao.getBar(new Bazoo());

मैं लिख सकता हूँ:

when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);

लेकिन स्पष्ट समस्या यह है कि मुझे getBar()उसी Bazooवस्तु के साथ कभी नहीं बुलाया जाता है, जिसके लिए मैंने विधि को ठूंसा है। (उस newऑपरेटर को शाप !)

मुझे अच्छा लगेगा अगर मैं इस तरीके से इस तरीके को ठूँस सकूँ कि यह myFooतर्क की परवाह किए बिना लौट आए । असफल होने पर, मैं अन्य वर्कअराउंड सुझावों को सुनूंगा, लेकिन मैं उत्पादन कोड को बदलने से बचना चाहूंगा जब तक कि उचित परीक्षण कवरेज न हो।

जवाबों:


456
when(
  fooDao.getBar(
    any(Bazoo.class)
  )
).thenReturn(myFoo);

या (एस से बचने के लिए null):

when(
  fooDao.getBar(
    (Bazoo)notNull()
  )
).thenReturn(myFoo);

माचिस आयात करना न भूलें (कई अन्य उपलब्ध हैं):

मॉकिटो 2.1.0 और नए के लिए:

import static org.mockito.ArgumentMatchers.*;

पुराने संस्करणों के लिए:

import static org.mockito.Matchers.*;

2
मुझे यह पसंद है जब जवाब 'स्वीकार जवाब फ्रीज' के अंत से पहले होता है।
एरिक विल्सन

10
वहाँ एक notNull(Bazoo.class)बस की तरह है any(Bazoo.class)(शायद यह इस जवाब के समय मौजूद नहीं था)
Dandre Allison

2
मेरे पास कुछ विशेष स्थिति थी जहां मैं या तो दो संभावित तर्क दे सकता था - Bazooया Cazooजो कि दोनों उपवर्ग हैं, कहते हैं Azoo,। क्योंकि Bazooमुझे लौटने की जरूरत है foo, लेकिन Cazooमुझे लौटने की जरूरत है bar। इस स्थिति में प्रस्तावित Matchers.any()समाधान काम नहीं करता है, हालांकि, Matchers.isA()सही काम करता है।
तनवीर

3
org.mockito.Matchersअब पदावनत किया जाता है - org.mockito.ArgumentMatchersइसके बजाय इसका उपयोग करें , अर्थात import static org.mockito.ArgumentMatchers.*( डॉक्स देखें )
DontDivideByZero

when(myFoo.knowsWhatsUp()).thenReturn(myMoney);
6rchid

18

इस तरह का उपयोग करें:

when(
  fooDao.getBar(
    Matchers.<Bazoo>any()
  )
).thenReturn(myFoo);

इससे पहले कि आप आयात करने की जरूरत है Mockito.Matchers


1
इससे वंचित हैं!
DrB

15

http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html

anyObject() अपनी आवश्यकताओं के अनुरूप होना चाहिए।

इसके अलावा, आप हमेशा लागू करने hashCode()और वर्ग के equals()लिए विचार कर सकते हैं Bazoo। इससे आपका कोड उदाहरण आपके इच्छित तरीके से काम करेगा।


दूसरे सुझाव से सहमत हैं, लेकिन मैं अभी भी गैर-तकनीकी कारणों से ऐसा नहीं करने का विरोध कर रहा हूं।
एरिक विल्सन

1
द मैचर्स क्लास को हटा दिया गया है ( डॉक्स देखें - "यह क्लास संभवतः संस्करण 3.0 में हटा दी जाएगी" )
जोहान्स रबाऊर

1

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

यहाँ एक उदाहरण है।

public class MyPojo {

    public MyPojo( String someField ) {
        this.someField = someField;
    }

    private String someField;

    @Override
    public boolean equals( Object o ) {
        if ( this == o ) return true;
        if ( o == null || getClass() != o.getClass() ) return false;
        MyPojo myPojo = ( MyPojo ) o;
        return someField.equals( myPojo.someField );
    }

}

फिर, यह मानते हुए कि आपके लिए मूल्य क्या someFieldहोगा, आप इसे इस तरह से मॉक कर सकते हैं।

when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);

पेशेवरों: यह अधिक स्पष्ट तो anyमैचर्स है। कोड के समीक्षक के रूप में, मैं anyकोड जूनियर डेवलपर्स के लिए एक आंख खुली रखता हूं , क्योंकि यह उनके कोड के तर्क पर नज़र रखता है ताकि उपयुक्त ऑब्जेक्ट को पारित किया जा सके।

con: कभी-कभी ऑब्जेक्ट को पास किया जा रहा फ़ील्ड रैंडम ID होता है। इस मामले के लिए आप आसानी से अपने मॉक कोड में अपेक्षित तर्क ऑब्जेक्ट का निर्माण नहीं कर सकते हैं।

एक अन्य संभावित दृष्टिकोण मॉकिटो की Answerवस्तु का उपयोग करना है जिसे whenविधि के साथ उपयोग किया जा सकता है । Answerआपको वास्तविक कॉल को इंटरसेप्ट करने और इनपुट तर्क का निरीक्षण करने और एक नकली वस्तु वापस करने की सुविधा देता है। नीचे दिए गए उदाहरण में मैं anyकिसी भी अनुरोध को पकड़ने के लिए उपयोग किया जा रहा हूं । लेकिन फिर Answerलंबोदर में, मैं आगे बाजो तर्क का निरीक्षण कर सकता हूं ... शायद यह सत्यापित करने के लिए कि इसके लिए एक उचित आईडी पारित की गई थी। मैं इसे anyअपने आप से अधिक पसंद करता हूं ताकि तर्क पर कम से कम कुछ निरीक्षण किया जाए।

    Bar mockBar = //generate mock Bar.

    when(fooDao.getBar(any(Bazo.class))
    .thenAnswer(  ( InvocationOnMock invocationOnMock) -> {
        Bazo actualBazo = invocationOnMock.getArgument( 0 );

        //inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
        return mockBar;
    } );

इसलिए इसे पूरा करने के लिए, मुझे भरोसा करना पसंद है equals(जहां अपेक्षित तर्क और वास्तविक तर्क एक-दूसरे के बराबर होने चाहिए) और यदि बराबर संभव नहीं है (वास्तविक तर्क की स्थिति की भविष्यवाणी करने में सक्षम नहीं होने के कारण), तो मैं इसका सहारा लूंगा। Answerतर्क का निरीक्षण करने के लिए।

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