मैं Mockito और JUnit 5 के साथ इंजेक्शन का उपयोग कैसे कर सकता हूं?
JUnit4 में मैं केवल @RunWith(MockitoJUnitRunner.class)एनोटेशन का उपयोग कर सकता हूं । JUnit5 में @RunWithएनोटेशन नहीं है ?
मैं Mockito और JUnit 5 के साथ इंजेक्शन का उपयोग कैसे कर सकता हूं?
JUnit4 में मैं केवल @RunWith(MockitoJUnitRunner.class)एनोटेशन का उपयोग कर सकता हूं । JUnit5 में @RunWithएनोटेशन नहीं है ?
जवाबों:
मॉकिटो का उपयोग करने के विभिन्न तरीके हैं - मैं उनके माध्यम से एक-एक करके जाऊँगा।
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और मॉकिटो धावक का उपयोग नहीं किया जा सकता है।
@Testको सार्वजनिक या "पैकेज निजी" होने के लिए एनोटेट पर्याप्त पर्याप्त है?
मॉकिटो का उपयोग करें 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
...
}
@ExtendWith(MockitoExtension.class)@RunWith(MockitoJUnitRunner.class)JUnit4 के बराबर है
करने के लिए अलग-अलग तरीके हैं, लेकिन क्लीनर तरीका है और यह भी सम्मान करता है कि 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?
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 के लिए डिज़ाइन किया गया है।
MockitoExtensionmockito-coreसंस्करण 3.0.0 में मौजूद नहीं है ।
mockito-junit-jupiter
आपको नए @ExtendWithएनोटेशन का उपयोग करना होगा ।
दुर्भाग्य से अभी तक कोई विस्तार नहीं हुआ है। पर GitHub आप विस्तार के लिए एक बीटा कार्यान्वयन देख सकते हैं। एक उदाहरण डेमो टेस्ट के रूप में ।