2013-08-05 21 views
6

Uno dei metodi statici che sto usando, fa due cose. Restituisce alcuni dati, ma modifica anche l'argomento oggetto che gli viene passato. Questo oggetto argomento aggiornato viene quindi utilizzato in seguito nel codice.doAnswer per metodi statici - PowerMock

Sto usando PowerMock per prendere in giro il comportamento di ritorno.

Per la definizione della seconda parte: aggiornamento dell'argomento di input, sto definendo il metodo doAnswer ma non funziona. Il metodo che sto cercando di testare sembra questo.

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))); 
}  

ma in alto genera errore dicendo "Stub non terminato rilevato qui". Connector è una classe di terze parti, quindi non ho il controllo sul suo comportamento.

Qualche suggerimento, cosa potrebbe andare storto?

risposta

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

Il tuo when è il problema. Nel normale Mockito, utilizzando qualsiasi doAnswer/doReturn/call, ecc, è necessario effettuare la chiamata si sta spegnendo di fuori della chiamata alla when, in questo modo:

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

PowerMockito richiede inoltre che le chiamate a metodi statici accadere in the next statement, in questo modo:

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

si noti che il documentation I linked è in realtà inconsistenti - sembra che i documenti alludono ad uno zero-arg when, mentre è richiesta la classe letterale nella firme inutilmente grado. Potrebbe essere una buona cosa flaggare come bug, se ne hai un momento.

PSA obbligatorio: Generalmente è una buona idea di avoid mocking types you don't own, anche se jury's still out on that one.

+0

thnx per il collegamento doc. Domani proveremo. – RandomQuestion

+0

Questo ha funzionato. Ho presentato un bug. Il soggetto non è da intendersi ma non riesco a modificarlo. https://code.google.com/p/powermock/issues/detail?id=452&can=4&q=javadoc – RandomQuestion