2013-03-05 10 views
16

मेरा प्रश्न है:Mockito @InjectMocks कैसे काम करता है?

मेरे पास कई वेब सेवा कक्षाएं हैं जो यह जांचने के लिए करती हैं कि सभी सामान्य सेवाओं से उनके तरीकों का उत्तराधिकारी हैं। प्रत्येक के लिए यूनिट टेस्ट लिखने के बजाय, मुझे लगता है कि मैं कार्यात्मक क्षेत्रों (यानी परीक्षण विधियों के तीन समूह, प्रत्येक एक अलग अंतर्निहित डीएओ विधि कॉल पर निर्भर करता है) द्वारा परीक्षण सूट को तोड़ सकता है।

मैं ऐसा करने का प्रस्ताव क्या है:

@Mock StateDAO mockedStateDao; 
@Mock CountyDAO mockedCountyDao; 
@Mock VisitorDAO mockedVisitorDao; 

तो फोन:

@InjectMocks CountyServiceImpl<County> countyService = new CountyServiceImpl<County>(); 
@InjectMocks StateServiceImpl<State> stateService = new StateServiceImpl<State>(); 
@InjectMocks VisitorServiceImpl<Visitor> visitorService = new VisitorServiceImpl<Visitor>(); 

मैं कैसे सुनिश्चित करें कि प्रत्येक mockedDAO सही सेवा में इंजेक्शन दिया जाएगा हो सकता है? क्या सभी तीनों को स्वचालित करना आसान होगा (@InjectMocks का उपयोग करने के बजाय)?

मैं स्प्रिंग, हाइबरनेट, और Mockito उपयोग कर रहा हूँ ...

+0

एक परीक्षण वर्ग के भीतर यह कर किया जाएगा। – DYezek

+0

इसके अलावा, मेरे पास @InjectMocks के लिए पहले से ही स्प्रिंग टेस्ट-एप्लिकेशन-context.xml फ़ाइल में आइटम हैं (इसलिए मैं उन्हें ऑटोवायर कर सकता हूं)। ऑटोवॉयरिंग और इंजेक्शनिंग मैक्स के बीच के अंतर पर निश्चित नहीं है। – DYezek

+1

अपने प्रश्न पर टिप्पणी छोड़ने के बजाय अतिरिक्त सामग्री जोड़ने के लिए अपना मूल प्रश्न संपादित करें। – ArtB

उत्तर

0

कोई बात नहीं, InjectMocks एनोटेशन एक क्षेत्र के रूप @Mock टिप्पणी के साथ कुछ भी व्यवहार करता है ऑनलाइन-देखा और इतने स्थिर-दायरे वाले (वर्ग चौड़ा) है, मैं वास्तव में guarentee नहीं कर सका कि मोक्स सही सेवा पर जाना होगा। कक्षा स्तर की बजाय फीचर स्तर पर इकाई परीक्षण करने की कोशिश करने के लिए यह कुछ हद तक एक विचार प्रयोग था। मान लीजिए कि मैं बस इस सामान को वसंत के साथ स्वचालित कर दूंगा ...

1

ठीक है, स्थिर विधि MockitoAnnotations.initMocks(Object) पूरी प्रक्रिया बूटस्ट्रैप करने के लिए उपयोग की जाती है।

मैं, यह कैसे काम करता पक्का पता नहीं है के रूप में मैं स्रोत कोड में ब्राउज़ नहीं किया है, लेकिन मैं इसे कुछ इस तरह लागू करना होगा:

  1. सदस्य चर के लिए पारित किया Object के वर्ग के लिए स्कैन @Mock एनोटेशन के साथ।
  2. प्रत्येक के लिए, उस वर्ग का एक नकली बनाएं, और उसे उस सदस्य को सेट करें।
  3. @InjectMocks एनोटेशन के साथ सदस्य चर के लिए उत्तीर्ण Object की कक्षा स्कैन करें।
  4. सदस्यों के लिए प्रत्येक पाए गए सदस्य की कक्षा को स्कैन करें, जिसमें इसे (2) (यानी, जहां क्षेत्र एक अभिभावक वर्ग/इंटरफेस है, या एक ही वर्ग है) के रूप में बनाया गया है। मॉक ऑब्जेक्ट्स क्लास घोषित) और इसे उस सदस्य को सेट करें।
19

खैर निकोलस का जवाब लगभग सही है, लेकिन बजाय सिर्फ InjectMocks की जावाडोक पर देखने के अनुमान लगा की, यह अधिक विवरण होता है;)

मेरे लिए यह एक भी टेस्ट मैच में इतने सारे सेवा के लिए अजीब है, यह एक इकाई परीक्षण के रूप में या एकीकरण परीक्षण के रूप में सही महसूस नहीं करता है। यूनिट टेस्ट में यह गलत है क्योंकि आपके पास बहुत अधिक सहयोगी हैं, यह ऑब्जेक्ट ओरिएंटेड (या सोलिड) जैसा नहीं दिखता है। एकीकरण परीक्षण में, यह अजीब है क्योंकि जिस कोड को आप डीबी के साथ एकीकरण का परीक्षण करते हैं, उसे नकल नहीं करते हैं।

एक तेजी से संदर्भ के लिए 1.9.5 में तुम हो:

मार्क एक क्षेत्र है जिस पर इंजेक्शन किया जाना चाहिए।

शॉर्टंड मॉक और जासूसी इंजेक्शन की अनुमति देता है। दोहराव वाले नकली और जासूसी इंजेक्शन को कम करता है। मॉकिटो या तो कन्स्ट्रक्टर इंजेक्शन, सेटर इंजेक्शन, या प्रॉपर्टी इंजेक्शन द्वारा या तो नीचे वर्णित रूप से मॉक्स इंजेक्ट करने का प्रयास करेगा। यदि निम्न में से कोई भी रणनीति विफल हो जाती है, तो मॉकिटो विफलता की रिपोर्ट नहीं करेगा; यानी आपको निर्भरताएं खुद को प्रदान करनी होंगी।

  1. कन्स्ट्रक्टर इंजेक्शन; सबसे बड़ा कन्स्ट्रक्टर चुना जाता है, तो तर्क केवल परीक्षण में घोषित मोक्स के साथ हल किए जाते हैं।

    नोट: यदि तर्क नहीं मिल पा रहे हैं, तो शून्य पास हो गया है। यदि गैर-नकली प्रकार चाहते हैं, तो कन्स्ट्रक्टर इंजेक्शन नहीं होगा। इन मामलों में, आपको निर्भरताओं को स्वयं संतुष्ट करना होगा।

  2. संपत्ति सेटर इंजेक्शन; मैक्स को पहले प्रकार से हल किया जाएगा, फिर, यदि संपत्ति के नाम और नकली नाम के मिलान से, उसी प्रकार की कई संपत्तियां हैं।

    नोट 1: आप एक ही प्रकार के (या एक ही विलोपन) के साथ गुण होते हैं, तो यह बेहतर है मिलान गुणों के साथ सभी @Mock एनोटेट क्षेत्रों के नाम पर है, अन्यथा Mockito भ्रमित हो सकता है और इंजेक्शन नहीं होगा।

    नोट 2: यदि @InjectMocks इंस्टेंस प्रारंभ नहीं किया गया था और नो-एर्ग कन्स्ट्रक्टर है, तो इसे इस कन्स्ट्रक्टर के साथ शुरू किया जाएगा।

  3. फील्ड इंजेक्शन; मैक्स को पहले प्रकार से हल किया जाएगा, फिर, यदि फ़ील्ड नाम और नकली नाम के मिलान से, उसी प्रकार की कई संपत्तियां हैं।

    नोट 1: आप एक ही प्रकार के (या एक ही विलोपन) के साथ खेतों है, तो यह बेहतर है मिलान क्षेत्रों के साथ सभी @Mock एनोटेट क्षेत्रों के नाम पर है, अन्यथा Mockito भ्रमित हो सकता है और इंजेक्शन नहीं होगा।

    नोट 2: यदि @InjectMocks इंस्टेंस प्रारंभ नहीं किया गया था और नो-एर्ग कन्स्ट्रक्टर है, तो इसे इस कन्स्ट्रक्टर के साथ शुरू किया जाएगा। https://bitbucket.org/kubek2k/springockito/wiki/Home

    जो भी यहाँ उल्लेख किया जाता है:

3

आप एक से अधिक सेवा है और एक स्प्रिंग आधारित वातावरण में मॉक-वस्तुओं के साथ DAOs को बदलने के लिए चाहते हैं, तो मैं Springockito उपयोग करने के लिए सिफारिश करेंगे: Injecting Mockito mocks into a Spring bean

आपका Testclass तो इस प्रकार दिखाई देंगे:

@RunWith (SpringJUnit4ClassRunner.class) 
@ContextConfiguration (loader = SpringockitoContextLoader.class, locations = {"classpath:/org/example/package/applicationContext.xml"}) 
public class NameOfClassTest { 

    @Autowired 
    @ReplaceWithMock 
    StateDAO mockedStateDao; 

    @Autowired 
    @ReplaceWithMock 
    CountyDAO mockedCountyDao; 

    @Autowired 
    @ReplaceWithMock 
    VisitorDAO mockedVisitorDao; 

अपने @Test या @Before Methode आप सेटअप अपने mocks मानक Mockito तरह से कर सकते हैं में:

Mockito.doReturn(null).when(mockedCountyDao).selectFromDB(); 
संबंधित मुद्दे