Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

...

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
languagejava
@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.

  • (advertencia) Hay que analizar cuidadosamente las respuestas que esperamos y el orden en el que deben llegar para que los test funcionen de manera correcta.