...
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 ServicioGestorExpedientesTest {
@Autowired
private MiServivico servicio;
// private static MockServer mock;
private static MockWebServer mockServer;
// URLs
private static final String LOGIN = "/public/recurso";
@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 ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@AfterAll
static void finalizaMockServer() {
if ( mockServer != null ) {
// mockServer.stop();
try {
mockServer.shutdown();
} catch ( IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@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( "Respuesta esperada1" );
salida = servicio.metodoServicioConWebClient();
assertThat( salida ).isEqualTo( "Respuesta esperada2" );
}
...
...
} |
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.