2012-04-16 14 views
6

मैं के रूप में इस great answer.एक मजाकिया कन्स्ट्रक्टर तर्क के साथ एक अमूर्त वर्ग का मज़ाक उड़ा रहा है?

चाल है में विस्तृत Mockito इकाई परीक्षण करने के लिए एक अमूर्त वर्ग उपयोग करना चाहते हैं, सार वर्ग एक रणनीति है कि इसके निर्माता में इंजेक्शन हो जाता है पर एक निर्भरता है। मैंने रणनीति का एक मजाक बनाया है और मैं अपने यूनिट परीक्षण के लिए मॉक रणनीति का उपयोग करने के लिए बेस क्लास के अपने मॉक किए गए उदाहरण के लिए चाहता हूं।

कोई सुझाव है कि मैं इसे कैसे तार सकता हूं? मैं वर्तमान में किसी भी आईओसी ढांचे का उपयोग नहीं कर रहा हूं, लेकिन वसंत पर विचार कर रहा हूं। शायद यह चाल चल जाएगा?

// abstract class to be tested w/ mock instance 
abstract BaseClass 
{ 
    // Strategy gets mocked too 
    protected BaseClass(Strategy strategy) 
    { 
     ... 
    } 
} 

अद्यतन:
Mockito मेलिंग सूची के अनुसार, वहाँ वर्तमान में एक नकली के निर्माता के लिए तर्क पारित करने के लिए एक तरीका नहीं है।

उत्तर

4

मैंने वसंत संदर्भ स्तर पर मॉकिटो का उपयोग करके इस तरह की चीज देखी।

जैसे:

<bean id="myStrategy" name="myStrategy" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="Strategy" /> 
</bean> 

मुझे आशा है कि मदद करता है।

-1

आपको कुछ विशेष करने की आवश्यकता नहीं है। बस सामान्य की तरह सेम नकली:

Bean bean = mock(Bean.class); 
when(bean.process()).thenReturn(somethingThatShouldBeNamedVO); 

बस काम करता है :)

+0

धन्यवाद, जॉर्डन! दुर्भाग्यवश, मुझे नहीं लगता कि यह मेरे मामले के लिए काम करेगा क्योंकि मुझे बेस में इंजेक्शन वाली रणनीति वर्ग में विशिष्ट मजाकिया व्यवहार की आवश्यकता है। यदि रणनीति का एक डिफ़ॉल्ट मॉक (जो सिर्फ शून्य, 0, इत्यादि देता है) का इस्तेमाल किया गया था तो मॉक बेस बेसस का तर्क टूट जाएगा। हालांकि धन्यवाद! – HolySamosa

+0

यह सवाल का जवाब नहीं देता है। –

4

मैं सिर्फ प्रतिबिंब का उपयोग कर, मेरी आधार वर्ग में एक निजी क्षेत्र की स्थापना की तो जैसे करने के लिए समाप्त हो गया:

// mock the strategy dependency 
Strategy strategyMock = mock(Strategy.class); 
when(....).thenReturn(...); 

// mock the abstract base class 
BaseClass baseMock = mock(BaseClass.class, CALLS_REAL_METHODS); 

// get the private streategy field 
Field strategyField = baseMock.getClass().getSuperclass().getDeclaredField("_privateStrategy"); 

// make remove final modifier and make field accessible 
Field modifiersField = Field.class.getDeclaredField("modifiers"); 
modifiersField.setAccessible(true); 
modifiersField.setInt(strategyField, strategyField.getModifiers() & ~Modifier.FINAL);   
strategyField.setAccessible(true); 

// set the strategy 
strategyField.set(baseMock, strategyMock); 

// do unit tests with baseMock 
... 

यह होगा तो निजी क्षेत्र का नाम कभी भी बदल गया है, लेकिन इसकी टिप्पणी की और मैं इसके साथ रह सकता हूं। यह आसान है, यह कोड की एक पंक्ति है और मुझे किसी भी सेटर्स को उजागर करने या मेरे परीक्षणों में स्पष्ट रूप से उपclass करने के लिए यह बेहतर लगता है।

संपादित करें: तो यह अब कोड की एक पंक्ति नहीं है क्योंकि मेरे निजी क्षेत्र को 'अंतिम' होने की आवश्यकता है, जिसके लिए कुछ अतिरिक्त प्रतिबिंब कोड की आवश्यकता होती है।

+1

ग्रेट पोस्ट! यदि आप स्प्रिंग निर्भरता रखते हैं तो आप यह सब एक पंक्ति के साथ कर सकते हैं ;-)। उपहारों के वसंत के बक्से के आसपास घूमते हुए इस कक्षा को मिला। 'org.springframework.test.util.ReflectionTestUtils.setField (बेसमॉक," _privateStrategy ", strategyMock)' –