JUnit5 के साथ मॉकिटो का उपयोग कैसे करें


103

मैं Mockito और JUnit 5 के साथ इंजेक्शन का उपयोग कैसे कर सकता हूं?

JUnit4 में मैं केवल @RunWith(MockitoJUnitRunner.class)एनोटेशन का उपयोग कर सकता हूं । JUnit5 में @RunWithएनोटेशन नहीं है ?

जवाबों:


144

मॉकिटो का उपयोग करने के विभिन्न तरीके हैं - मैं उनके माध्यम से एक-एक करके जाऊँगा।

मैन्युअल

Mockito::mockJUnit संस्करण (या उस मामले के लिए परीक्षण ढांचे) की परवाह किए बिना काम के साथ मैन्युअल रूप से नकली बनाना ।

एनोटेशन आधारित

का उपयोग करते हुए @Mock -annotation और करने के लिए इसी कॉल MockitoAnnotations::initMocks करने के लिए mocks बनाने JUnit संस्करण की परवाह किए बिना काम करता है (या उस बात के लिए परीक्षण ढांचे लेकिन परीक्षण कोड एक मॉड्यूल में समाप्त होता है या नहीं जावा 9 यहां हस्तक्षेप कर सकता है, के आधार पर)।

मॉकिटो एक्सटेंशन

JUnit 5 का एक शक्तिशाली विस्तार मॉडल है और मॉकिटो हाल ही में समूह / विरूपण साक्ष्य ID org.mockito के तहत एक प्रकाशित किया गया है : mockito-junit-jupiter

आप @ExtendWith(MockitoExtension.class)परीक्षण वर्ग के साथ जोड़कर और के साथ नकली खेतों की व्याख्या करके विस्तार को लागू कर सकते हैं @Mock। से MockitoExtensionकी JavaDoc:

@ExtendWith(MockitoExtension.class)
public class ExampleTest {

    @Mock
    private List list;

    @Test
    public void shouldDoSomething() {
        list.add(100);
    }

}

मॉकिटोएक्स्टेंशन डॉक्यूमेंटेशन मॉक को तत्काल करने के अन्य तरीकों का वर्णन करता है, उदाहरण के लिए कंस्ट्रक्टर इंजेक्शन के साथ (यदि आप परीक्षण कक्षाओं में अंतिम क्षेत्रों को बेहतर बनाते हैं)।

नो रूल्स, नो रनर

JUnit 4 नियम और धावक JUnit 5 में काम नहीं करते हैं, इसलिए MockitoRuleऔर मॉकिटो धावक का उपयोग नहीं किया जा सकता है।


6
अब एक आधिकारिक Mockito Junit5 एक्सटेंशन है जो MockitoJUnitRunner के बराबर है -> mockito-junit-jupiter
dan carter

जब मॉकिटो के लिए आधिकारिक एक्सटेंशन जारी किया गया था, तो इसे कॉन्फ़िगर करने और उपयोग करने के तरीके के साथ अधिक विवरण के साथ एक ब्लॉग पोस्ट लिखा: solidsoft.wordpress.com/2018/03/27/…
Marcin Zajączkowski

क्या विधि @Testको सार्वजनिक या "पैकेज निजी" होने के लिए एनोटेट पर्याप्त पर्याप्त है?
गीक

बृहस्पति के साथ परीक्षण चलाते समय (जिसे अक्सर "JUnit 5" कहा जाता है), परीक्षण विधियों को केवल पैकेज-दृश्य होने की आवश्यकता होती है।
निकोलै

56

मॉकिटो का उपयोग करें MockitoExtension। विस्तार एक नई कलाकृति में निहित है mockito-junit-jupiter:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>2.23.4</version>
    <scope>test</scope>
</dependency>

यह आपको परीक्षण लिखने की अनुमति देता है जैसा कि आपने JUnit 4 के साथ किया होगा:

import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;

@ExtendWith(MockitoExtension.class)
class MyTest {

    @Mock
    private Foo foo;

    @InjectMocks
    private Bar bar; // constructor injection

    ...
}

5
@ExtendWith(MockitoExtension.class)@RunWith(MockitoJUnitRunner.class)JUnit4 के बराबर है
सर्गेई

9

करने के लिए अलग-अलग तरीके हैं, लेकिन क्लीनर तरीका है और यह भी सम्मान करता है कि JUnit 5 दर्शन org.junit.jupiter.api.extension.Extensionमॉकिटो के लिए बना रहा है ।

1) मैन्युअल रूप से मॉक बनाना अतिरिक्त मॉकिटो चेक का लाभ खो देता है ताकि यह सुनिश्चित हो सके कि आप सही तरीके से फ्रेमवर्क का उपयोग करते हैं।

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

3) टेस्ट नियम एक JUnit 4 विशिष्टता है।
ऐसा भी मत सोचो।
और प्रलेखन उस बारे में स्पष्ट है:

हालाँकि, यदि आप JUnit 5 के लिए एक नया एक्सटेंशन विकसित करने का इरादा रखते हैं, तो कृपया JUnit 4 के नियम-आधारित मॉडल के बजाय JUnit Jupiter के नए एक्सटेंशन मॉडल का उपयोग करें।

4) टेस्ट रनर वास्तव में JUnit 5 ढांचे का विस्तार करने का तरीका नहीं है।
JUnit 5 एक्सटेंशन्स की बदौलत JUnit 5 के रन एक्सटेंशन के लिए एक्सटेंशन मॉडल प्रदान करके JUnit 4 के रनर्स के नरक को सरल बनाया गया।
ऐसा भी मत सोचो।

तो एहसान करो org.junit.jupiter.api.extension.Extension


संपादित करें: वास्तव में, मॉकिटो एक बृहस्पति विस्तार को बंडल करता है: mockito-junit-jupiter

फिर, उपयोग करने के लिए बहुत सरल:

import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class FooTest {
     ...    
}

यहाँ जोनाथन के उत्कृष्ट उत्तर को जोड़ा गया है।

निर्भरता mockito-junit-jupiterविरूपण साक्ष्य के रूप में जोड़कर , @ExtendWith(MockitoExtension.class)परीक्षण निष्पादित होने के बाद निम्न अपवाद का उपयोग किया जाता है:

java.lang.NoSuchMethodError: org.junit.platform.commons.support.AnnotationSupport.findAnnotation (Ljava / use / Optional; Ljava / lang / Class;) Ljava / use / Optional;

यह समस्या mockito-junit-jupiterदो स्वतंत्र पुस्तकालयों पर निर्भर करती है। उदाहरण के लिए mockito-junit-jupiter:2.19.0:

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>2.19.0</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-api</artifactId>
  <version>5.1.0</version>
  <scope>runtime</scope>
</dependency>

समस्या मैं इस्तेमाल किया गया था junit-jupiter-api:5.0.1

तो जैसा कि junit-jupiter-apiएपीआई के मामले में अभी भी अक्सर चलता है, सुनिश्चित करें कि आप का एक ही संस्करण पर निर्भर बनाने junit-jupiter-apiकि mockito-junit-jupiterपर निर्भर करता है।


क्यों mockito-junit-jupiterउचित संस्करण नहीं खींचता है junit-jupiter-api?
२१

@haelix क्योंकि इस निर्भरता के लिए उपयोग की जाने वाली संस्करण रणनीति मॉकिटो लाइब्रेरी पर निर्भर करती है। यहाँ संस्करण देखें mockito-junit-jupiter:2.19.0। जबकि ज्यूनीट ज्यूपिटर संस्करण के साथ शुरू होता है 5। mockito-junit-jupiter को अपनी आर्टिफिशियल आइडेंटिफायर में दो चीजों (Mockito वर्जन और JUnit Jupiter वर्जन) को स्पष्ट करने के लिए निर्दिष्ट करना चाहिए। उदाहरण के लिए mockito-junit-jupiter-5.1:2.19.0यह बताने के लिए कि पुस्तकालय JUnit Jupiter 5.1 के लिए डिज़ाइन किया गया है।
davidxxx

MockitoExtensionmockito-coreसंस्करण 3.0.0 में मौजूद नहीं है ।
१६ को

1
mockito-junit-jupiter
@Thunderforge

3

आपको नए @ExtendWithएनोटेशन का उपयोग करना होगा ।

दुर्भाग्य से अभी तक कोई विस्तार नहीं हुआ है। पर GitHub आप विस्तार के लिए एक बीटा कार्यान्वयन देख सकते हैं। एक उदाहरण डेमो टेस्ट के रूप में

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