Puedes utilizar pruebas del lado del cliente para probar el código que utiliza internamente RestTemplate
.
La idea es declarar las solicitudes esperadas y proporcionar "respuestas auxiliares" para que pueda concentrarse en
probar su código en un entorno aislado (es decir, sin ejecutar el servidor). El siguiente ejemplo muestra cómo hacer
esto:
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/saludo")).andRespond(withSuccess());
// Pruebe el código usando el RestTemplate anterior...
mockServer.verify();
val restTemplate = RestTemplate()
val mockServer = MockRestServiceServer.bindTo(restTemplate).build()
mockServer.expect(requestTo("/saludo")).andRespond(withSuccess())
// Pruebe el código usando el RestTemplate anterior...
mockServer.verify()
En el ejemplo anterior, MockRestServiceServer
(la clase central para las pruebas REST del lado del
cliente) configura RestTemplate
usando un ClientHttpRequestFactory
especial que valida que
las solicitudes reales coinciden con los eventos esperados y devuelven "respuestas auxiliares". En este caso,
estamos esperando una solicitud de /greeting
y queremos devolver una respuesta 200 con el contenido
text/plain
. Si es necesario, puede definir solicitudes esperadas adicionales y respuestas resguardadas.
Si definimos las solicitudes y respuestas esperadas, RestTemplate
se puede usar en el código del lado
del cliente como de costumbre. Al final de la prueba, puede utilizar mockServer.verify()
para
asegurarse de que se hayan producido todos los eventos esperados.
De forma predeterminada, las solicitudes se esperan en el orden en que se declararon los eventos esperados. Puede
configurar la opción ignoreExpectOrder
al crear el servidor, en cuyo caso se verificarán todos los
eventos esperados (en orden) para encontrar una coincidencia para la solicitud especificada. Esto significa que las
solicitudes pueden presentarse en cualquier orden. El siguiente ejemplo utiliza ignoreExpectOrder
:
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
servidor = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()
Incluso con consultas desordenadas, de forma predeterminada, cada consulta solo puede ejecutarse una vez. El método
expect
proporciona una sobrecarga que toma un argumento ExpectedCount
que especifica el
rango del recuento (por ejemplo, once
, manyTimes
, max
, min
,
between
, etc.). El siguiente ejemplo utiliza el rango times
:
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(times(2), requestTo("/algo")).andRespond(withSuccess());
mockServer.expect(times(3), requestTo("/somewhere")).andRespond(withSuccess());
//...
mockServer.verify();
val restTemplate = RestTemplate()
val mockServer = MockRestServiceServer.bindTo(restTemplate).build()
mockServer.expect(times(2), requestTo("/algo")).andRespond(withSuccess())
mockServer.expect(times(3), requestTo("/en algún lugar")).andRespond(withSuccess())
//...
mockServer.verify()
Tenga en cuenta que si ignoreExpectOrder
no está configurado (el valor predeterminado) y, por lo tanto,
se esperan solicitudes en el orden de declaración, entonces ese orden solo se aplica a la primera de las solicitudes
esperadas. Por ejemplo, si se espera "/algo" dos veces y luego "/algo" tres veces, entonces la solicitud a "/algo"
debe ir antes de la solicitud a "/algo", pero además de estos "/algo" posteriores. y "/somewhere", las solicitudes
pueden llegar en cualquier momento.
Como alternativa a todo lo anterior, la función de soporte de pruebas del lado del cliente también proporciona una
implementación ClientHttpRequestFactory
que se puede configurar en RestTemplate
para
vincularse a una instancia. de MockMvc
. Esto le permite procesar solicitudes utilizando lógica real del
lado del servidor, pero sin ejecutar el servidor. El siguiente ejemplo muestra cómo hacer esto:
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
this.restTemplate = new RestTemplate(new MockMvcClientHttpRequestFactory(mockMvc));
// Pruebe el código usando el RestTemplate anterior ...
val mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build()
restTemplate = RestTemplate(MockMvcClientHttpRequestFactory(mockMvc))
// Pruebe el código usando el RestTemplate anterior ...
Importación estática
Al igual que con las pruebas del lado del servidor, una API fluida para pruebas del lado del cliente requiere que se
importen algunos elementos estáticos. Se pueden encontrar fácilmente buscando MockRest*
. Los usuarios
de Eclipse deben agregar MockRestRequestMatchers.*
y MockRestResponseCreators.*
como
"miembros estáticos favoritos" en las preferencias de Eclipse en Java → Editor → Asistencia de contenido →
Favoritos. Esto le permitirá utilizar la asistencia de contenido después de ingresar el primer carácter del nombre
del método estático. Es posible que otros IDE (como IntelliJ) no requieran configuración adicional. Verifique la
compatibilidad con la finalización de código para miembros estáticos.
Otros ejemplos de pruebas REST del lado del cliente
Las pruebas nativas de Spring MVC incluyen ejemplos de prueba REST en el lado del cliente.
GO TO FULL VERSION