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:

Java
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();
Kotlin
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:

Java
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
Kotlin
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:

Java
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();
Kotlin
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:

Java
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
this.restTemplate = new RestTemplate(new MockMvcClientHttpRequestFactory(mockMvc));
// Pruebe el código usando el RestTemplate anterior ...
Kotlin
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.