2012-08-16 14 views
19

मैं मॉकिटो 1.8.5 का उपयोग करके एक विधि को स्टब करने की कोशिश कर रहा हूं, लेकिन ऐसा करने से वास्तविक विधि कार्यान्वयन ("" पार्म वैल्यू के रूप में) "को अपवाद देता है जो अपवाद फेंकता है ।पैकेज संरक्षित विधि स्टब करने का प्रयास करते समय मॉकिटो मॉक वास्तविक विधि कार्यान्वयन को कॉल करना

package background.internal; //located in trunk/tests/java/background/internal 

public class MoveStepTest { 

    @Test 
    public void testMoveUpdate() { 
     final String returnValue = "value"; 
     final FileAttachmentContainer file = mock(FileAttachmentContainer.class); 
     doReturn(returnValue).when(file).moveAttachment(anyString(), anyString(), anyString()); 
     //this also fails 
     //when(file.moveAttachment(anyString(), anyString(), anyString())).thenReturn(returnValue); 

     final AttachmentMoveStep move = new AttachmentMoveStep(file); 
     final Action moveResult = move.advance(1, mock(Context.class)); 
     assertEquals(Action.done, moveResult); 
    } 
} 

जिस विधि को मैं नकली करने की कोशिश कर रहा हूं वह इस तरह दिखता है। कोई अंतिम विधि या कक्षाएं नहीं हैं।

package background.internal; //located in trunk/src/background/internal 


    public class FileAttachmentContainer { 
     String moveAttachment(final String arg1, final String arg2, final String arg3) 
       throws CustomException { 
      ... 
     } 

     String getPersistedValue(final Context context) { 
      ...  
     } 
    } 

और वर्ग मैं इस तरह नकली लगता गुजर रही है:

package background.internal; //located in trunk/src/background/internal 
public class AttachmentMoveStep { 

    private final FileAttachmentContainer file; 

    public AttachmentMoveStep(final FileAttachmentContainer file) { 
     this.file = file;   
    } 

    public Action advance(final double acceleration, final Context context) { 
     try { 
      final String attachmentValue = this.file.getPersistedValue(context); 
      final String entryId = this.file.moveAttachment(attachmentValue, "attachment", context.getUserName()); 

      //do some other stuff with entryId 
     } catch (CustomException e) { 
      e.log(context); 
     }  
     return Action.done; 
    } 
} 

क्या वास्तविक कार्यान्वयन खड़ी कर रहा है लागू किया जा करने के लिए और मैं इसे कैसे रोक सकते हैं?

+0

क्या आप वह कोड जोड़ सकते हैं जो वास्तव में परीक्षण निष्पादित कर रहा है? – jhericks

+1

'FileAttachmentContainer' या विधि' moveAttachment() 'अंतिम है? मॉकिटो अंतिम तरीकों का नकल नहीं कर सकता है। –

+0

क्या चल रहा है अटैचमेंट वास्तव में किसी भी स्ट्रिंग() के मानों के साथ बुलाया जाता है? – markus

उत्तर

19

जिस विधि का आप मजाक कर रहे हैं वह मॉकिटो कोड तक पहुंच योग्य नहीं है।

क्योंकि आपका टेस्ट कोड और परीक्षण के तहत आपका कोड उसी पैकेज में है, इसलिए कंपाइलर आपको इस तरह अपना मॉक सेट करने देता है, लेकिन रनटाइम पर, मॉकिटो लाइब्रेरी को moveAttachment तक पहुंचने का प्रयास करना पड़ता है, लेकिन यह आपके काम नहीं कर रहा है मामला। यह मॉकिटो में bug या known limitation प्रतीत होता है क्योंकि इसे उस मामले का समर्थन करना चाहिए, (और वास्तव में, अधिकांश मामलों में इसका समर्थन करता है)।

सबसे आसान बात यह है कि moveAttachment एक सार्वजनिक विधि बनाना होगा। यदि यह कोई विकल्प नहीं है, तो पहले सवाल करें कि क्या आप इसे नकल करना चाहते हैं। वास्तविक विधि कहलाता है तो क्या होता है?

अंतिम विकल्प PowerMock का उपयोग moveAttachment विधि को निजी विधि के रूप में उपयोग करने और इस तरह से नकल करने के लिए करना है।

+0

ऐसा लगता है कि यह मुद्दा है। ऐसा लगता है कि अन्य लोगों ने इसमें भाग लिया है: http://code.google.com/p/mockito/issues/detail?id=127 धन्यवाद –

+0

यह सही नहीं है। सामान्य रूप से Mockito बिना किसी समस्या के पैकेज निजी तरीकों का नकल कर सकते हैं। यह बग ओएसजीआई/सीलबंद जार या कुछ इसी तरह की समस्या के साथ एक समस्या प्रतीत होता है। –

+0

@ Arendv.Reinersdorff, यदि यह सच है, तो PowerMock अभी भी चाल करेगा? यदि ऐसा है, तो मैं इसका जवाब "क्यों" भाग को बेहतर ढंग से प्रतिबिंबित करने के लिए अपना उत्तर बदलूंगा। – jhericks

0

मैं स्वीकृत प्रतिक्रिया से असहमत हूं।

मुझे लगता है, आपको अपने पर्यावरण पर अधिक जानकारी प्रदान करनी है। मैं आपकी समस्या का पुनरुत्पादन नहीं कर सकता। मैं एक Maven परियोजना में निम्न कोड लिखें:

package background.internal; //located in src/main/java 

public class FileAttachmentContainer { 
    String moveAttachment(String arg1, String arg2, String arg3) { 
     throw new IllegalStateException(); 
    } 

    String getPersistedValue(Context context) { 
     throw new IllegalStateException(); 
    } 
} 

और

package background.internal; 

public class AttachmentMoveStep { 

    private FileAttachmentContainer file; 

    public AttachmentMoveStep(FileAttachmentContainer file) { 
     this.file = file; 
    } 

    public Action advance(double acceleration, Context context) { 
     String attachmentValue = file.getPersistedValue(context); 
     file.moveAttachment(attachmentValue, "attachment", context.getUserName()); 
     return Action.done; 
    } 
} 

और निम्न परीक्षण पास

package background.internal; //located in src/test/java 

import static org.junit.Assert.assertEquals; 
import static org.mockito.Matchers.anyString; 
import static org.mockito.Mockito.doReturn; 
import static org.mockito.Mockito.mock; 

import org.junit.Test; 

public class MoveStepTest { 

    @Test 
    public void testMoveUpdate() { 
     String returnValue = "value"; 
     FileAttachmentContainer file = mock(FileAttachmentContainer.class); 
     doReturn(returnValue).when(file).moveAttachment(anyString(), anyString(), anyString()); 
     //this also works 
     //when(file.moveAttachment(anyString(), anyString(), anyString())).thenReturn(returnValue); 

     AttachmentMoveStep move = new AttachmentMoveStep(file); 
     Action moveResult = move.advance(1, mock(Context.class)); 
     assertEquals(Action.done, moveResult); 
    } 
} 

मेरे परियोजना निम्नलिखित निर्भरता का उपयोग करें:

  • jdk1.7.0_05
  • JUnit-4.10.jar
  • mockito सभी-1.9.0.jar
  • javassist-3.16.1-GA.jar
  • objenesis-1.2.jar
  • hamcrest कोर-1.1.jar
+3

यह कोई जवाब नहीं है। यह सिर्फ यह बता रहा है कि आप यह नहीं समझ सकते कि प्रश्नकर्ता को समस्या क्यों है। सवाल यह था, "वास्तविक कार्यान्वयन का क्या कारण बन रहा है? और मैं इसे कैसे रोक सकता हूं?" मैंने जवाब दिया कि "मैं इसे कैसे रोक सकता हूं" लेकिन केवल "इसका कारण क्या है" भाग पर अनुमान लगाया गया था। इस जवाब में न तो है। यह जवाब सिर्फ इतना कहता है कि यह _should_ काम करता है और आप नहीं जानते कि यह क्यों नहीं करता है। – jhericks

+0

@ जेरिकिक्स, आप सही हैं, मैं नहीं और क्यों मेरे लिए यह एक समस्या है। मुझे लगता है कि हमें चीज़ के नीचे जाना चाहिए और समस्या का मूल कारण ढूंढना चाहिए। न सिर्फ कुछ कामकाज प्रदान करें। – gontard

+0

@gontard क्या आप दो अलग जारों में संकलित थे? परीक्षण के साथ एक और कार्यान्वयन के साथ एक? –

संबंधित मुद्दे