Mock REST con Spring

De Dos Ideas.
Revisión del 15:32 23 oct 2012 de Emiliano.tebes (discusión | contribuciones) (Archivo de contexto)
Saltar a: navegación, buscar

Usando MockRestServiceServer para testear un cliente Rest en componente

Situación

Capa de acceso a datos que interactúa como cliente de un servicio REST.

Necesidad

Construir tests de componente del DAO, que queden auto-contenidos.

Para resolver este problema, recurrimos a la clase MockRestServiceServer, incluida en los jars de spring social (y también en el core de Spring a partir de las últimas versiones). Para poder utilizar una instancia de esta clase, se debe crear a partir de una instancia de la clase RestTemplate. Dicho elemento debe ser declarado en el archivo xml de configuración de contexto de nuestros tests.

Archivo de contexto
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
	<constructor-arg ref="httpClientFactory"/>
	<property name="messageConverters">
		<list>
			<bean  class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
		</list>
	</property>
</bean>
En la clase de Test
imports
import org.springframework.test.web.client.MockRestServiceServer;
import org.springframework.test.web.client.RequestMatchers;
import org.springframework.test.web.client.ResponseActions;
import org.springframework.test.web.client.ResponseCreators;
import org.springframework.test.web.server.MockMvc;
import static org.springframework.test.web.server.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.server.result.MockMvcResultMatchers.status;
import org.springframework.test.web.server.setup.MockMvcBuilders;
import org.springframework.web.client.RestTemplate;
Declaración de las variables
  @Autowired
  private RestTemplate restTemplate;
  private MockRestServiceServer mockServer;


Preparación de cada uno de los test
   @Before
   public void setUp() {
       mockMvc = MockMvcBuilders.standaloneSetup(instanciaDeClaseATestear).build();
       mockServer = MockRestServiceServer.createServer(restTemplate);
   }

En los tests propiamente dichos, preparar las peticiones esperadas y sus respectivas respuestas:

ResponseActions responseAction = mockServer
          .expect(RequestMatchers.requestTo("http://miURL:puerto/recurso"));                
       responseAction
          .andExpect(RequestMatchers.header("Accept", "application/json"))
          .andRespond(ResponseCreators.withStatus(HttpStatus.BAD_REQUEST));


Por ejemplo, en el caso anterior, se espera que cuando sea llamada la URL "http://miURL:puerto/recurso" se responda con un 404. A partir de este punto, ya se pueden ejercitar los métodos de nuestras clases que invoquen a los servicios REST con las URL configuradas. Aclaración: en el caso que querramos esperar varias peticiones, las mismas tienen que ser declaradas en el orden en el que serán invocadas.