2008-09-11 11 views
38

कोडEasyMock: मैं बिना किसी चेतावनी के जेनेरिक क्लास का नकली कैसे बना सकता हूं?

private SomeClass<Integer> someClass; 
someClass = EasyMock.createMock(SomeClass.class); 

मुझे एक चेतावनी "प्रकार की सुरक्षा: प्रकार SomeClass की अभिव्यक्ति SomeClass < पूर्णांक > के अनुरूप अनियंत्रित रूपांतरण की जरूरत है" देता है।

उत्तर

3

दो स्पष्ट मार्ग चेतावनी को दबाने या उप-वर्ग को नकल करने के लिए हैं।

private static class SomeClass_Integer extends SomeClass<Integer>(); 
private SomeClass<Integer> someClass; 
... 
    someClass = EasyMock.createMock(SomeClass_Integer.class); 

:

+0

के बजाय

MyItem myItem = createMock(myItem.class); List<MyItem> myItemList = new ArrayList<MyItem>(); myItemList.add(myItem); 

वाक्य रचना शायद होना चाहिए: निजी स्थिर इंटरफ़ेस SomeClass_Integer SomeClass फैली {} मैं एक ही समस्या है और इस काम है चारों ओर मुझे ऐसा दृष्टिकोण का उपयोग काम करेगा। लेकिन मुझे आशा है कि किसी के पास जवाब है कि हम –

2

आप @SuppressWarnings("unchecked") साथ परीक्षा पद्धति टिप्पणी कर सकते हैं (अस्वीकरण भी इस कोड को संकलित करने के लिए प्रयास नहीं किया, न ही मैं EasyMock इस्तेमाल किया है।)। मैं मानता हूं कि यह कुछ हैक का क्या है लेकिन मेरी राय में यह परीक्षण कोड पर स्वीकार्य है।

@Test 
@SuppressWarnings("unchecked") 
public void someTest() { 
    SomeClass<Integer> someClass = EasyMock.createMock(SomeClass.class); 
} 
+2

हाँ की तलाश में हैं, लेकिन इससे मुझे सस्ते लग रहा है –

+2

यदि आप इस मार्ग पर जाते हैं (उम्मीद है कि एक बेहतर तरीका है), तो पूरी तरह से परिवर्तनीय असाइनमेंट पर @SuppressWarnings को रखना बेहतर होगा तरीका। – SamBeran

39

AFAIK, आप अनियंत्रित चेतावनी से बच सकते हैं नहीं जब शाब्दिक वर्ग का नाम शामिल है, और SuppressWarnings एनोटेशन एक ही तरीका है इस संभाल करने के लिए है।

ध्यान दें कि SuppressWarnings एनोटेशन जितना संभव हो सके एनोटेशन को सीमित करने के लिए यह एक अच्छा रूप है। आप किसी एक स्थानीय चर काम करने के लिए यह व्याख्या आवेदन कर सकते हैं:

public void testSomething() { 

    @SuppressWarnings("unchecked") 
    Foo<Integer> foo = EasyMock.createMock(Foo.class); 

    // Rest of test method may still expose other warnings 
} 

या एक सहायक विधि का उपयोग करें:

@SuppressWarnings("unchecked") 
private static <T> Foo<T> createFooMock() { 
    return (Foo<T>)EasyMock.createMock(Foo.class); 
} 

public void testSomething() { 
    Foo<String> foo = createFooMock(); 

    // Rest of test method may still expose other warnings 
} 
11

मैं एक उपवर्ग शुरू, उदा इस समस्या को हल काम किया

private abstract class MySpecialString implements MySpecial<String>{}; 

फिर उस अमूर्त वर्ग के एक नकली बनाने के लिए:

MySpecial<String> myMock = createControl().createMock(MySpecialString.class); 
+0

इसके अतिरिक्त, अमूर्त वर्ग का उपयोग करते समय अपने मैक्स बनाने के लिए EasyMock के 'org.easymock.classextension.EasyMock' संस्करण का उपयोग करना न भूलें। – Andreas

+0

EasyMock 3.0 (मई 2010) के रूप में, 'org.easymock.classextension' में वर्गों को बहिष्कृत किया गया है और' org.easymock' में समान नामित कक्षाओं के लिए सरल प्रॉक्सी हैं। आपके आयात से ".classextension" को निकालने और क्लैसक्स्टेंशन लाइब्रेरी के साथ संकलन रोकने की अनुशंसा की जाती है। – AndrewF

0

मैं इस सवाल के खिलाफ जाता है पता है, लेकिन क्यों नहीं एक नकली सूची के बजाय एक सूची बनाने के?

यह कम कोड और काम करने में आसान है, उदाहरण के लिए यदि आप सूची में आइटम जोड़ना चाहते हैं।

MyItem myItem = createMock(myItem.class); 
@SuppressWarnings("unchecked") 
List<MyItem> myItemList = createMock(ArrayList.class); 
expect(myItemList.get(0)).andReturn(myItem); 
replay(myItemList); 
संबंधित मुद्दे