Diferencia entre revisiones de «Mock REST con Spring»

De Dos Ideas.
Saltar a: navegación, buscar
(Archivo de contexto)
Línea 58: Línea 58:
 
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.
 
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.
 
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.
 +
 +
 +
== Ver también ==
 +
* [http://static.springsource.org/spring-social/docs/1.0.x/api/org/springframework/social/test/client/MockRestServiceServer.html API Oficial]

Revisión del 15:51 23 oct 2012

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.


Ver también