2010-12-28 13 views
9

Tuve un problema con burlar al cliente Apache Http. El siguiente intento para crear un simulacro:¿Por qué mi objeto de simulacro de Mockito usa la implementación real

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

No se puede crear un verdadero simulacro. La fila superior es ejecutado sin excepciones, pero cuando trato de código auxiliar algún comportamiento:

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

me sale una excepción a un método en el 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) 

¿Por qué es la llamada a ejecutar dentro Mockito. cuando se pasa a AbstractHttpClient?

Encontré una solución a este problema específico: utilizar la interfaz HttpClient en lugar de intentar simular la subclase concreta. Esta es una solución mucho mejor en este caso, pero me pregunto en general qué está pasando aquí. ¿Por qué no puedo burlarme de esta clase concreta correctamente con Mockito? ¿Hay algo especial sobre DefaultHttpClient? ¿Hay otros casos en que Mockito no puede burlarse de las clases concretas?

estoy usando Mockito 1.8.5, 4.0.3 Apache httpclient, Apache HTTP núcleo 4.1, JDK 1.6.0 en OSX

Respuesta

15

Varios de los métodos en AbstractHttpClient son finales y por lo tanto no puede ser burlado. OMI, este comportamiento es la razón # 1 para no burlarse de las clases concretas.

+0

¡Eso es todo, gracias! – auramo

3

Pruebe esta sintaxis (sólo una muestra, no un código real):

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

Ver este enlace para una mejor explicación del problema/solución: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#doReturn(java.lang.Object)

+0

Como mencioné anteriormente, burlarse de la interfaz HttpClient funciona, el problema fue con la clase concreta DefaultHttpClient. En este caso, por supuesto, se recomienda que se burle de la interfaz y no de la implementación predeterminada. Solo tenía curiosidad por qué la burla no funcionaba; a veces tendrás que burlarte de clases concretas y este conocimiento puede ser útil. – auramo

+0

Aún no puede anular la creación estática de HttpClient si eso es lo que hace su código. es decir, HttpClients.createDefault() – RonanOD

Cuestiones relacionadas