...
Una vez tenemos configurada nuestra configuración de test, con los WebClient preparados podemos comenzar la implementación de nuestra clase de test. Un ejemplo de implementación sería el siguiente
| Bloque de código | ||
|---|---|---|
| ||
@TestPropertySource( locations = "classpath:application-test.properties" ) @ContextConfiguration( classes = {MiServivico.class} ) @SpringBootTest @Import( WebClientTestConfiguration.class ) @TestInstance( TestInstance.Lifecycle.PER_CLASS ) class MiTestConServiciosExternosTest { ... ... @Autowired private MiServivico servicio; // private static MockServer mock; private static MockWebServer mockServer; @BeforeAll public void iniciaMockServer() { //Creamos una instancia de mockServer mockServer = new MockWebServer(); try { //Arrancamos mockServer en el puerto que hemos indicado en la configuración mockServer.start( WebClientTestConfiguration.PORT ); } catch ( IOException e ) { log.error("Error inicianzo mockserver",e) } } @AfterAll static void finalizaMockServer() { if ( mockServer != null ) { // mockServer.stop(); try { mockServer.shutdown(); } catch ( IOException e ) { log.error("Error deteniendo mockserver",e) } } } @Test void miTest() throws Exception { String datosARecibir1 = "json1"; String datosARecibir2 = "json2"; //Encolamos las respuestas a recibir mockServer.enqueue( new MockResponse().setBody( datosARecibir1 ).addHeader( "Content-Type", "application/json" ) ); mockServer.enqueue( new MockResponse().setBody( datosARecibir2 ).addHeader( "Content-Type", "application/json" ) ); String salida = servicio.metodoServicioConWebClient(); assertThat( salida ).isEqualTo( "json1" ); salida = servicio.metodoServicioConWebClient(); assertThat( salida ).isEqualTo( "json2" ); } ... ... } |
Del código anterior los detalles importantes son
- Anotación @Import( WebClientTestConfiguration.class ): Con esta anotación le decimos a nuestra clase de test que use la configuracíon indicada en WebClientTestConfiguration.class
- Creamos un método con @BeforeAll en el que se crea e inicializa MockWeb server en el mismo puerto que se especifica en nuestra configuración de WebClients
- mockServer.enqueue( ... ): Con esta línea encolamos (por orden) las diferentes respuestas que deben devolver todos los servicios externos a los que llamemos. Mockserver recibirá todas las peticiones Http que hagan los servicios y devolverá la respuesta que tenga en la cola.
Con este código ya podremos emular llamadas a servicios externos y MockServer irá devolviendo las peticiones que tenga almacenadas.
Hay que analizar cuidadosamente las respuestas que esperamos y el orden en el que deben llegar para que los test funcionen de manera correcta.