2017-07-20 15 views
5

असली कार्यान्वयन का उपयोग कर mockMap क्यों है? मैं इसे कैसे रोकूं? जब परीक्षण चल रहा है 0:वास्तविक कार्यान्वयन का उपयोग कर मॉकिटो मॉक ऑब्जेक्ट

विधि testFirstKeyMatch

when(mockMap.keySet().toArray()[0])... 

में ArrayIndexOutOfBoundsException फेंकता है।

MaxSizeHashMap, 7 की अधिकतम आकार के साथ एक LinkedHashMap है एक IndexOutOfBoundsException फेंकता है जब मैं में और अधिक डाल करने के लिए प्रयास करते हैं।

प्रोफ़ाइल इस के लिए आवश्यक कुछ का ट्रैक रखता है।

SuperClass.java

public class SuperClass { 

protected String[] days; 
protected MaxSizeHashMap<String, String> map; 

public SuperClass() { 
    days = new String[7]; 
    map = new MaxSizeHashMap<String, String>(); 
    //... 
} 

void updateDays() { 

    cal = Calendar.getInstance(); 

    for (int i = 0; i < 7; i = i + 1) { 

     //adds short names "Mon", "Tue", ... to days 
     days[i] = cal.getDisplayName(Calendar.DAY_OF_WEEK, 
       Calendar.SHORT, Locale.US); 

     cal.add(Calendar.DATE, 1); 
    } 
} 

void firstKeyMatch(Profile profile) { 

    updateDays(); 

    //checks if first key of map is not same as days[0] 
    if (days[0] != map.keySet().toArray()[0]) { 

     profile.add(); 

     //... 
    } 
} 
} 

SuperClassTest.java

@RunWith(MockitoJUnitRunner.class) 
public class SuperClassTest { 

@InjectMocks 
private SuperClass spr = new SuperClass(); 

@Mock 
private MaxSizeHashMap<String, String> mockMap; 

@Mock 
private Profile mockProfile; 

//... 

@Test 
public void testFirstKeyMatch() { 

    when(mockMap.keySet().toArray()[0]).thenReturn(spr.days[0]); 

    verify(mockProfile, never()).add(); 

} 
} 
+1

प्रयास करें इस 'जब (mockMap.keySet())। फिर रीटर्न (नया हैशसेट (Arrays.asList ("आपका दिन स्ट्रिंग")); ~ – Abubakkar

+1

के साथ आप जिस भी मूल्य का परीक्षण कर रहे हैं उसके साथ "अपनी दिन स्ट्रिंग" को प्रतिस्थापित करके, यह वास्तविक कार्यान्वयन नहीं है, मैक्स डिफ़ॉल्ट मान वापस कर देता है। 'KeySet()' के मामले में, यह एक खाली संग्रह है। – Jonathan

उत्तर

3

documentation के अनुसार, mockito के एक नकली के लिए अंतर्निहित व्यवहार default values वापस जाने के लिए है।

डिफ़ॉल्ट रूप से, एक मूल्य लौटने वाली सभी विधियों के लिए, एक नकली या तो शून्य, एक आदिम/आदिम रैपर मान, या एक खाली संग्रह, उचित के रूप में वापस आ जाएगा। उदाहरण के लिए 0 इंट/इंटीजर और बुलियन/बूलियन के लिए झूठी।

परिणाम में, अपने mockMap.keySet() एक खाली हैश सेट है, जो आप तो एक खाली सरणी में परिवर्तित होकर (न के बराबर) पहला तत्व है, इसलिए IOOBE प्राप्त करने का प्रयास वापस आ जाएगी।

debugger

अंत में, mockito वास्तविक कार्यान्वयन का उपयोग नहीं कर रहा है, लेकिन यह सामान्य रूप से व्यवहार कर रहा है के रूप में यह चाहिए था।

आपने SuperClass के पूरे कन्स्ट्रक्टर को पोस्ट नहीं किया है, लेकिन शायद आप मानचित्र को तुरंत चालू करने के बाद, आप इसे मूल्यों के साथ भी पॉप्युलेट करते हैं। यदि यह सच है, तो कोई तर्क दे सकता है कि अपवाद वास्तव में प्रमाण है कि मॉकिटो वास्तविक कार्यान्वयन का उपयोग नहीं करता है, क्योंकि आपको वास्तव में पहला तत्व मिल रहा है।

समाधान के लिए के रूप में, अच्छी तरह से यह पहले से ही जो भी डेटा की आवश्यकता के साथ सेट अपने स्वयं के हैश वापस जाने के लिए सुझाव दिया गया है (क्रेडिट Abubakkar पर जाएं):

when(mockMap.keySet()).thenReturn(new HashSet(Arrays.asList("your day string"))); 
1

spr.days[i] करने के लिए सभी mockMap.keySet().toArray()[i] कॉल पुनर्निर्देशित करने के लिए, जब कोई कुंजी सेट अनुरोध जो आप mockMap बता सकते हैं days सरणी वापस जाने के लिए।

Set keySetMock = mock(Set.class); 
when(keySetMock.toArray()).thenReturn(spr.days); 
when(mockMap.keySet()).thenReturn(keySetMock); 
संबंधित मुद्दे