2013-08-05 9 views
6

मैं जिस स्थिर विधि का उपयोग कर रहा हूं, वह दो चीजें करता है। यह कुछ डेटा देता है, लेकिन यह उस तर्क वस्तु को भी संशोधित करता है जो इसे पारित किया जाता है। इस अद्यतन तर्क ऑब्जेक्ट को बाद में कोड में उपयोग किया जाता है।स्थिर तरीकों के लिए doAnswer - PowerMock

मैं रिटर्न व्यवहार का नकल करने के लिए पावरमैक का उपयोग कर रहा हूं।

दूसरे भाग को परिभाषित करने के लिए - इनपुट तर्क को अद्यतन करने के लिए, मैं doAnswer विधि को परिभाषित कर रहा हूं लेकिन यह काम नहीं कर रहा है। जिस विधि को मैं परीक्षण करने की कोशिश कर रहा हूं वह इस तरह दिखता है।

public void login() throws ConnectionException, AsyncApiException { 
    ConnectorConfig partnerConfig = new ConnectorConfig(); 

    //This call sets the value in one member variable 'serviceEndPoint in ParterConfig which is accessed later in this method only. 
    partnerConnection = Connector.newConnection(partnerConfig); 

    //partnerConfig.getServiceEndpoint is called. 

    PowerMockito.mockStatic(Connector.class); 
    when(Connector.newConnection(Mockito.any(ConnectorConfig.class))).thenReturn(partnerConnection); 

    PowerMockito.doAnswer(new Answer<Void>() { 
     @Override 
     public Void answer(InvocationOnMock invocation) { 
      ConnectorConfig config = (ConnectorConfig) invocation.getArguments()[0]; 
      config.setServiceEndpoint("service end point"); 
      return null; 
     } 
    }).when(Connector.newConnection(Mockito.any(ConnectorConfig.class))); 
}  

लेकिन उपरोक्त त्रुटि बताती है कि 'यहां अनफिनिड स्टबिंग का पता चला है'। Connector एक तृतीय पक्ष वर्ग है इसलिए मेरे व्यवहार पर नियंत्रण नहीं है।

कोई सुझाव, क्या गलत हो सकता है?

उत्तर

11
PowerMockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(Connector.newConnection(Mockito.any(ConnectorConfig.class))); 

आपका when समस्या है। सामान्य Mockito में, किसी भी doAnswer/doReturn/आदि कॉल का उपयोग करके, आप when करने के लिए कॉल आप बाहर छोटा करते रहे हैं कॉल की जगह है, इसलिए की तरह है:

Mockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(yourMock).callVoidMethod(); 
//   ^^^^^^ 

PowerMockito आगे कहा कि स्थिर तरीकों के लिए कॉल की आवश्यकता है in the next statement हो, तो जैसे:

PowerMockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(Connector.class); Connector.newConnection(/*...*/); 
//     ^^^^^^ 

ध्यान दें कि documentation I linked वास्तव में असंगत है - लगता है कि डॉक्स, एक शून्य आर्ग when का उल्लेख करने, जबकि वर्ग शाब्दिक हस्ताक्षर लाभ में आवश्यक है योग्य। यदि आपके पास एक पल है, तो एक बग के रूप में ध्वजांकित करना एक अच्छी बात हो सकती है।

अनिवार्य पीएसए: यह आम तौर पर avoid mocking types you don't own एक अच्छा विचार है, हालांकि jury's still out on that one है।

+0

डॉक्टर लिंक के लिए thnx। मैं कल कोशिश करूँगा। – RandomQuestion

+0

यह काम किया। मैंने एक बग दायर किया है। विषय इंगित नहीं है लेकिन मैं इसे संपादित नहीं कर सकता। https://code.google.com/p/powermock/issues/detail?id=452&can=4&q=javadoc – RandomQuestion

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