2015-08-28 7 views
5

मैंने एक समस्या में भाग लिया है जिसमें @InjectMocks के लिए मॉकिटो के @Mock एनोटेशन के लिए फ़ील्ड इंजेक्शन मिलान उस मामले में काम नहीं कर रहा है जहां 2 @Mock एक ही प्रकार के हैं। मैं @Mock (name = "name_of_var") वाक्य रचना का उपयोग किया है और साथ ही, लेकिन यह अभी भी विफल रहा है ...PowerMockRunner के साथ चलते समय मैं @InjectMocks फ़ील्ड मिलान का उपयोग क्यों नहीं कर सकता?

यहाँ परीक्षण के अंतर्गत वर्ग है:

@RunWith(PowerMockRunner.class) 
    @PrepareForTest({System.class, Parent.class}) 
    public class testParent{ 

    @Mock (name = "dateB") private Date someOtherDate; 
    @Mock (name = "dateA") private Date someDate;  

    @InjectMocks Parent p; 

    @Before 
    public void setup(){ 
     Mockito.when(someOtherDate.getTime()).thenReturn(500l); 
     PowerMockito.mockStatic(System.class); 
     PowerMockito.when(System.currentTimeMillis()).thenReturn(2000l); 
    } 

    @Test 
    public void testGetDateAGetTimeShouldReturn1000() { 
     Mockito.when(someDate.getTime()).thenReturn(1000l); 
     Date result = p.getDateA(); 
     assertEquals(1000l, result.getTime()); 
    } 

    @Test 
    public void testGetDateBGetTimeShouldReturn500() { 
     Date result = p.getDateB(); 
     assertEquals(500l, result.getTime()); 
    } 

जब परीक्षण किया:

import java.util.Date; 
    public class Parent{ 

    private Date dateA; 
    private Date dateB; 

    public void setDateA(Date _dateA){ 
     dateA = _dateA; 
    } 

    public void setDateB(Date _dateB){ 
     dateB = _dateB; 
    } 

    public Date getDateA(){ 
     return dateA; 
    } 

    public Date getDateB(){ 
     return dateB; 
    } 

यहाँ परीक्षण ही है assertEquals दोनों इस तथ्य के कारण @InjectMocks काम नहीं करता है।

अब, जब मैंने को @RunWith(MockitoJUnitRunner.class) के साथ बदल दिया, तो यह ठीक काम करता है।

इसके अलावा, अगर मैं सिर्फ 1 DateParent.java में चर (जैसे कि, dateA) और मेल खाता हुआ नकली ParentTest में इंजेक्षन करने के लिए परिभाषित किया था, तब भी वह अच्छे PowerMockRunner.class का उपयोग कर डालेगी।

मुझे PowerMockRunner.class के साथ चलने का कारण यह है क्योंकि मैं स्थिर कार्यों के साथ-साथ कन्स्ट्रक्टरों का नकल करने में सक्षम होना चाहिए।

मैं जूनिट 4.12, मॉकिटो-ऑल-1.10.1 9, और पावरमैक-मॉकिटो-1.6.2-पूर्ण के साथ चल रहा हूं।

क्या कोई इस कारण को देखता है कि यह PowerMockRunner.class के साथ ठीक से इंजेक्ट क्यों नहीं करता है? PowerMockRunner.class के साथ चलते समय इसके लिए कोई कामकाज है?

उत्तर

4

यदि आप PowerMockRunner का उपयोग करने जा रहे हैं, तो आपको एनोटेशन का उपयोग करके बनाए गए मैक्स को प्रारंभ करने के लिए MockitoAnnotations.initMocks() पर कॉल करना होगा।

हालांकि, InjectMocks का उपयोग न करने के कई अच्छे कारण हैं। आम तौर पर, आपके परीक्षण की स्थापना के तरीके पर कम नियंत्रण होता है। new पर कॉल करना और मैन्युअल रूप से तर्क पास करना बेहतर है। इसके अलावा, अगर कोई समस्या है तो मॉकिटो चुपचाप विफल हो जाएगा। See more in this article:

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

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