2014-05-09 8 views
30

Mockito.mock(Class<T> classToMock) विधि और @Mock एनोटेशन के बीच क्या अंतर है? क्या वे वही हैं?Mockito.mock (SomeClass) और @Mock एनोटेशन के बीच क्या अंतर है?

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

private TestClass test = Mockito.mock(TestClass.class); 

एक ही रूप में:

@Mock 
private TestClass test; 

उत्तर

34

वे दोनों एक ही परिणाम प्राप्त है। एनोटेशन (@Mock) का उपयोग आमतौर पर "क्लीनर" माना जाता है, क्योंकि आप बॉयलरप्लेट असाइनमेंट के साथ अपना कोड भर नहीं पाते हैं, जो सभी समान दिखते हैं।

ध्यान दें कि आदेश @Mock एनोटेशन का उपयोग करने के लिए, अपने परीक्षण वर्ग @RunWith(MockitoJUnitRunner.class) साथ एनोटेट किया जाना चाहिए या उसके @Before विधि में MockitoAnnotations.initMocks(this) लिए एक कॉल हो।

+1

@InjectMocks –

+0

के बारे में न भूलें और त्रुटि संदेशों में नकली नामों को न भूलें। तो दोनों एक ही परिणाम प्राप्त _quite_ नहीं है। –

8

अंतर कोड की पंक्तियों लिखने की ज़रूरत :) :) :)

में है गंभीरता से हालांकि, एनोटेशन का उपयोग करने से Mockito.mock का उपयोग करने के समान सटीक प्रभाव पड़ता है।

  • परीक्षण के लिए आवश्यक वस्तुओं की आशुलिपि निर्माण की अनुमति देता:

    MockitoAnnotations के प्रलेखन एनोटेशन का उपयोग निम्नलिखित लाभ है के शब्दों में।

  • पुनरावर्तक नकली निर्माण कोड को कम करता है।

  • परीक्षण कक्षा को और अधिक पठनीय बनाता है।

  • सत्यापन त्रुटि को पढ़ने में आसान बनाता है क्योंकि क्षेत्र का नाम
    नकली पहचानने के लिए उपयोग किया जाता है।

जावाडोक MockitoAnnotations के लिए here

+0

मुझे शॉर्टेंड कहने में अजीब लगता है। हां, इसे कम वर्णों की आवश्यकता है, लेकिन इसके लिए अधिक लाइनों की आवश्यकता है। –

+1

सॉफ़्टवेयर विकास शॉर्टैंड के संदर्भ में मैंने हमेशा शॉर्टेंड का अर्थ यह बताया है कि मुझे कम कोड लिखना है :) – geoand

+1

@RogerCSWernersson - आप एक ही पंक्ति पर एनोटेशन डाल सकते हैं, एनोटेशन को निम्नलिखित नई लाइन की आवश्यकता नहीं है। – Tasgall

4

वे दोनों एक ही माना जाता है और वही करता है, लेकिन मैं एक दूसरे के पसंद करते हैं:

  • को कम करता है दोहराए नकली निर्माण कोड:

    @Mock एक एनोटेशन जो है।

  • टेस्ट क्लास को और अधिक पठनीय बनाता है।
  • परीक्षण के लिए आवश्यक वस्तुओं की शॉर्टेंड निर्माण की अनुमति देता है।
2

एनोटेशन का उपयोग करने के दो महत्वपूर्ण फायदे हैं।

  • @Mock के साथ बनाई गई एक नकली वर्ग आप परीक्षण कर रहे हैं में इंजेक्ट किया जा सकता है, @InjectMocks एनोटेशन का उपयोग कर। यह एक शक्तिशाली तकनीक है जो परीक्षण को काफी आसान बना सकती है। यह mock विधि द्वारा बनाए गए मोजे के साथ काम नहीं करेगा।
  • यदि आपके पास अपने नकली से जुड़ी कोई त्रुटि है, तो संदेश में नकली का नाम दिखाई देगा। यदि आपने @Mock का उपयोग किया है, तो यह नाम केवल फ़ील्ड का नाम होगा। यह समस्या नकली खोजने में वास्तव में आसान बनाता है।

बेशक, इन दो महत्वपूर्ण लाभ के अलावा, ज्यादातर लोगों @Mock अंकन और अधिक पठनीय मिल जाए, और यह कोड की मात्रा में कटौती करता है। मुझे इसका उपयोग न करने का कोई कारण नहीं दिखता है।

0

प्रश्न का उत्तर एक बड़ी गलती है। हमने Mockito.mock (Your.class) के कारण फ़ील्ड के रूप में कुछ समस्याएं हल की हैं। हमारे पास कुछ @Test विधियां थीं। चौथी विधि 'तत्कालीन थ्रो (पूर्व)' के साथ अपवाद फेंक रही थी। विफल होने के बाद सभी @ टेस्ट विधियों और कारण अपवाद फेंक दिया गया था। वे मजाकिया उदाहरण और 'कब' स्थिति साझा कर रहे थे। हम

@Mock 
TestClass testInstance; 

को

TestClass testInstance = Mockito.mock(TestClass.class); 

से बदल के बाद सब कुछ अपेक्षा के अनुरूप काम शुरू कर दिया। तो Mockito.mock परीक्षण विधियों के बीच एक साझा नकली बना रहा है, और @Mock नहीं करता है।

+1

यह गलत है। यदि आप '@ मॉक 'का उपयोग करते हैं, तो आपको' @ पहले 'में' MockitoAnnotations.initMocks (this)' का उपयोग करना होगा, जो कि 'Mockito.mock (Some.class)' को लिखने के बराबर है '@ इससे पहले 'सेटअप विधि। (तब प्रत्येक परीक्षण से पहले नकली को फिर से बनाया जाता है और आपके द्वारा वर्णित समस्या दूर हो जाती है) – Andrejs

+0

यह दूर जा सकता है लेकिन यह एक मुख्य अंतर है। – saferJo

संबंधित मुद्दे