2010-05-27 18 views
26

मेरे पास एक तरीका है कि मैं इकाई परीक्षण करने की कोशिश कर रहा हूं। यह विधि एक पैरामीटर के रूप में पैरामीटर लेती है और इसके साथ चीजें करता है। नकली मैं परिभाषित करने के लिए कोशिश कर रहा हूँ है:।mockito ArrayList <String> समस्या

ArrayList<String> mocked = mock(ArrayList.class); 

जो एक [अनियंत्रित] अनियंत्रित रूपांतरण "चेतावनी देता है

ArrayList<String> mocked = mock(ArrayList<String>.class); 

मुझे एक त्रुटि देता है

किसी को भी ध्यान मेरे लिए के रूप में स्पष्ट करने के। मैं क्या गलत कर रहा हूं?

उत्तर

52

विकल्प @Mock एनोटेशन का उपयोग करने के बाद से तो Mockito प्रकार प्रतिबिंब का उपयोग कर सकते सामान्य प्रकार मिल रहा है:

public class MyTest { 

    @Mock 
    private ArrayList<String> mockArrayList; 

    ... 

    public void setUp() { 
    MockitoAnnotations.initMocks(this); 
    } 

    public void testMyTest() { 
    when(mockArrayList.get(0)).thenReturn("Hello world"); 

    String result = mockArrayList.get(0); 

    assertEquals("Should have the correct string", "Hello world", result); 

    verify(mockArrayList).get(0); 
    } 
} 
+1

धन्यवाद। स्मार्ट समाधान यह थोड़े अनुचित है, कि इसे इसके रूप में चिह्नित नहीं किया गया है। – pimpf0r

+0

ग्रेट उत्तर, मैं इस दृष्टिकोण का उपयोग कर समाप्त हुआ। –

+0

हाँ, उस प्रश्न को उम्र में नहीं देखा ... क्षमा करें। – Sardathrion

23

ArrayList<String>.class जावा कंपाइलर द्वारा समर्थित एक निर्माण नहीं है।

आप पहली कोशिश के लिए, आप इस करना चाहिए:

@SuppressWarnings("unchecked") 
ArrayList<String> mocked = mock(ArrayList.class); 

यह इसलिए होता है क्योंकि mock विधि केवल एक कच्चे प्रकार लौट सकते हैं। आम तौर पर कच्चे प्रकारों का उपयोग करना अच्छा नहीं होता क्योंकि इससे रनटाइम त्रुटियां हो सकती हैं। आपके मामले में यह बिल्कुल ठीक है, क्योंकि आप जानते हैं कि mocked एक वास्तविक ArrayList<String> वैसे भी नहीं है।

बस एक सामान्य सलाह @SuppressWarnings("unchecked") एनोटेशन के बारे में सलाह दें। जितना संभव हो सके समस्या के स्रोत के करीब रखने की कोशिश करें। उदाहरण के लिए आप इसे केवल परिवर्तनीय घोषणा के लिए रख सकते हैं, या आप इसे पूरी विधि के लिए दबा सकते हैं। सामान्य रूप से इसे एक चर के लिए दबाएं, क्योंकि अन्यथा व्यापक विधि एनोटेशन आपके फ़ंक्शन में अन्य समस्याओं को दबा सकता है।

+3

एक तरफ ध्यान दें के रूप में, इस विशेष समस्या पन्नों पर (आइटम 24 के रूप में चर्चा की है 116- 118) प्रभावी जावा, द्वितीय संस्करण का। संपूर्ण जेनिक्स अध्याय सूर्य की साइट पर पीडीएफ के रूप में उपलब्ध है: http://java.sun.com/docs/books/effective/generics.pdf – Powerlord

+0

यह समझ में आता है। आम तौर पर मैं चेतावनियों को अनदेखा करता हूं लेकिन मुझे पता नहीं था कि आप केवल एक पंक्ति को अनदेखा कर सकते हैं। धन्यवाद। – Sardathrion