2010-12-28 9 views
9

Ho riscontrato un problema con il client di Apache Http. Il seguente tentativo di creare un mock:Perché il mio oggetto fittizio Mockito utilizza realmente l'implementazione

DefaultHttpClient httpClient = Mockito.mock(DefaultHttpClient.class); 

non riesce a creare un vero e finto. La riga sopra viene eseguito senza eccezioni, ma quando provo a stub alcuni comportamenti:

Mockito.when(httpClient.execute(Mockito.<HttpUriRequest>anyObject())).thenReturn(null); 

ottengo un'eccezione da un metodo in AbstractHttpClient:

Exception in thread "main" java.lang.IllegalArgumentException: Request must not be null. 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:572) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554) 

Perché la chiamata per eseguire all'interno Mockito. passato a AbstractHttpClient?

Ho trovato una soluzione a questo problema specifico: utilizzare l'interfaccia HttpClient invece di provare a prendere in giro la sottoclasse concreta. Questa è una soluzione molto migliore in questo caso, ma mi chiedo in generale che cosa sta succedendo qui? Perché non posso prendere in giro questa classe concreta in modo appropriato con Mockito? C'è qualcosa di speciale su DefaultHttpClient? Ci sono altri casi in cui Mockito non può prendere in giro lezioni concrete?

sto usando Mockito 1.8.5, Apache HttpClient 4.0.3, Apache nucleo http 4.1, JDK 1.6.0 su OSX

risposta

15

Molti dei metodi su AbstractHttpClient sono definitive e quindi non sarà preso in giro. IMO, questo comportamento è la ragione numero 1 per non prendere in giro lezioni concrete.

+0

Ecco, grazie! – auramo

3

Prova questa sintassi (solo un esempio, non un vero e proprio codice):

import static Mockito.*; 
// ... 
HttpClient httpClient = mock(HttpClient.class); 
doReturn(null).when(httpClient).execute(anyObject()). 

Vedere questo link per una migliore spiegazione del problema/soluzione: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#doReturn(java.lang.Object)

+0

Come accennato in precedenza, il mocking contro l'interfaccia HttpClient funziona, il problema era con la classe concreta DefaultHttpClient. In questo caso, ovviamente, si consiglia di prendere in giro l'interfaccia e non l'implementazione predefinita. Ero solo curioso del perché il beffardo non funzionasse; a volte devi prendere in giro le lezioni concrete e quindi questa conoscenza può diventare utile. – auramo

+0

Non è ancora possibile eseguire l'override della creazione statica di HttpClient se questo è ciò che fa il codice. cioè HttpClients.createDefault() – RonanOD

Problemi correlati