संक्षेप में:
@Spyऔर @Mockकोड के परीक्षण में भारी उपयोग किया जाता है, लेकिन डेवलपर्स उन मामलों में भ्रमित करते हैं जब उनमें से एक का उपयोग करना होता है और इस प्रकार डेवलपर्स @Mockसुरक्षित होने का उपयोग करते हुए समाप्त हो जाते हैं।
@Mockजब आप
वास्तव में उस पद्धति को कॉल किए बिना केवल कार्यक्षमता का बाहरी रूप से परीक्षण करना चाहते हैं, तब उपयोग करें ।
- का प्रयोग करें
@Spyजब आप कार्यक्षमता का परीक्षण करना चाहते हैं बाह्य + आंतरिक रूप से बहुत विधि बुलाया जा रहा है।
नीचे उदाहरण है जहां मैंने अमेरिका में Election20xx का परिदृश्य लिया है ।
मतदाताओं को VotersOfBelow21और के अनुसार विभाजित किया जा सकता है VotersOfABove21।
आदर्श एग्जिट पोल में कहा गया है कि ट्रम्प चुनाव जीतेंगे क्योंकि VotersOfBelow21और VotersOfABove21दोनों ट्रम्प को वोट देंगे, " हम राष्ट्रपति ट्रम्प निर्वाचित "
लेकिन यह वास्तविक परिदृश्य नहीं है:
दोनों आयु वर्ग के मतदाताओं ने ट्रम्प को वोट दिया क्योंकि उनके पास श्री ट्रम्प के अलावा कोई अन्य प्रभावी विकल्प नहीं था।
तो आप इसे कैसे टेस्ट करते हैं ??
public class VotersOfAbove21 {
public void weElected(String myVote){
System.out.println("Voters of above 21 has no Choice Than Thrump in 20XX ");
}
}
public class VotersOfBelow21 {
public void weElected(String myVote){
System.out.println("Voters of below 21 has no Choice Than Thrump in 20XX");
}
}
public class ElectionOfYear20XX {
VotersOfAbove21 votersOfAbove21;
VotersOfBelow21 votersOfBelow21;
public boolean weElected(String WeElectedTrump){
votersOfAbove21.weElected(WeElectedTrump);
System.out.println("We elected President Trump ");
votersOfBelow21.weElected(WeElectedTrump);
System.out.println("We elected President Trump ");
return true;
}
}
अब पहले दो वर्गों में ध्यान दें, दोनों आयु वर्ग के लोगों का कहना है कि उनके पास ट्रम्प से बेहतर विकल्प नहीं है। जिसका स्पष्ट अर्थ है कि उन्होंने ट्रम्प को सिर्फ इसलिए वोट दिया क्योंकि उनके पास कोई विकल्प नहीं था।
अब ElectionOfYear20XX कहते हैं कि ट्रम्प जीत गए क्योंकि दोनों आयु वर्ग ने उन्हें भारी मत दिया।
अगर हम ElectionOfYear20XX@Mock के साथ टेस्ट करने वाले थे , तो हो सकता है कि ट्रम्प की जीत की असली वजह हमें नहीं मिल पाएगी, हम सिर्फ बाहरी कारण को परखेंगे।
यदि हम ElectionOfYear20XX@Spy के साथ परीक्षण करते हैं , तो हमें असली कारण मिलता है कि ट्रम्प ने बाहरी एक्जिट पोल परिणामों के साथ आंतरिक रूप से + बाहरी रूप से जीत हासिल की।
हमारी ELectionOfYear20XX_Testकक्षा:
@RunWith(MockitoJUnitRunner.class)
public class ELectionOfYear20XX_Test {
@Mock
VotersOfBelow21 votersOfBelow21;
@Mock
VotersOfAbove21 votersOfAbove21;
@InjectMocks
ElectionOfYear20XX electionOfYear20XX;
@Test
public void testElectionResults(){
Assert.assertEquals(true,electionOfYear20XX.weElected("No Choice"));
}
}
यह सिर्फ लॉजिक टेस्ट के परिणाम यानी बाहरी जाँच का उत्पादन करना चाहिए :
We elected President Trump
We elected President Trump
@Spyबाहरी पद्धति के साथ-साथ आंतरिक रूप से वास्तविक विधि आह्वान के साथ परीक्षण ।
@RunWith(MockitoJUnitRunner.class)
public class ELectionOfYear20XX_Test {
@Spy
VotersOfBelow21 votersOfBelow21;
@Spy
VotersOfAbove21 votersOfAbove21;
@InjectMocks
ElectionOfYear20XX electionOfYear20XX;
@Test
public void testElectionResults(){
Assert.assertEquals(true,electionOfYear20XX.weElected("No Choice"));
}
}
आउटपुट:
Voters of above 21 has no Choice Than Thrump in 20XX
We elected President Trump
Voters of below 21 has no Choice Than Thrump in 20XX
We elected President Trump