2013-08-28 21 views
17

के लिए एक में फंस हो जाएगा मैं परीक्षण के अंतर्गत एक विधि है जो निम्न स्निपेट वाली है मजाक:Mockito: एक ArrayList कि पाश

private void buildChainCode(List<TracedPath> lines){ 
    for(TracedPath path : lines){ 
     /.../ 
    } 
} 

मेरे इकाई परीक्षण कोड इस तरह दिखता है:

public class ChainCodeUnitTest extends TestCase { 

    private @Mock List<TracedPath> listOfPaths; 
    private @Mock TracedPath tracedPath; 

    protected void setUp() throws Exception { 
     super.setUp(); 
     MockitoAnnotations.initMocks(this); 
    } 

    public void testGetCode() { 
     when(listOfPaths.get(anyInt())).thenReturn(tracedPath); 

     ChainCode cc = new ChainCode(); 
     cc.getCode(listOfPaths); 

     /.../ 
    } 
} 

समस्या यह है कि परीक्षण चलाने के दौरान, परीक्षण कोड कभी लूप के लिए प्रवेश नहीं करता है। जब मुझे शर्तों को निर्दिष्ट करना चाहिए, तो क्या लूप को दर्ज किया जाएगा? वर्तमान में मैंने when(listOfPaths.get(anyInt())).thenReturn(tracedPath) निर्दिष्ट किया है, लेकिन मुझे लगता है कि इसका कभी भी उपयोग नहीं किया जाता है।

उत्तर

47

आपकी समस्या यह है कि जब आप प्रत्येक लूप के लिए संग्रह का उपयोग करते हैं, तो इसकी iterator() विधि कॉल की जाती है; और आपने उस विशेष विधि को नहीं दबाया है।

सूची का मज़ाक उड़ाते हुए, मैं दृढ़ता से अनुशंसा करता हूं कि आप केवल एक वास्तविक सूची पास करें, जहां तत्व केवल आपके मॉक TracedPath हैं, जितनी बार आप चाहते हैं। जैसे

listOfPaths = Arrays.asList(mockTracedPath, mockTracedPath, mockTracedPath); 
+0

धन्यवाद, यह एक अच्छा विचार है। एक अच्छी व्याख्या भी। :) –

+0

क्या होगा यदि आप उन तत्वों को नहीं जानते जो सूची में जोड़े जाएंगे? – BlueShark

+0

आप जो परीक्षण करने का प्रयास कर रहे हैं उसके आधार पर आप तत्व चुनते हैं। –

4

कुछ जावा के लिए-प्रत्येक अपने buildChainCode विधि बुला नहीं है get(), आप पहले से ही पता लगा के रूप में अंदर इस्तेमाल पाश - यह iterator() विधि Collection<E> में परिभाषित किया गया है, जो List<E> फैली उपयोग कर रहा है।

I वास्तव में सूची का मज़ाक लगाने की अनुशंसा नहीं करेगा। इसका कोई फायदा नहीं है, जब तक कि आपको पूरी तरह से जांच नहीं करनी चाहिए कि सूची को फिर से चालू किया गया था, और फिर भी, कुछ इनपुट दिए गए अपने वर्ग के व्यवहार के परिणामों पर जोर देना या सत्यापित करना बेहतर है।

List<E>LinkedList<E> जैसे tracedPath के साथ कुछ कार्यान्वयन पास करें।

+0

एक अच्छी व्याख्या के लिए धन्यवाद। मैं इसे एक उत्तर के रूप में चिह्नित करूंगा लेकिन एक बहुत ही समान आपके सामने केवल 3 मिनट पहले जमा किया गया था। –

+0

आपकी टिप्पणी के लिए धन्यवाद। मुझे अपनी पोस्ट खत्म करने से पहले कुछ ठीक करने के लिए बुलाया गया - सीएस्ट ला वी :) डेविड का एक अच्छा जवाब है। –