Guía de DirtiesContext en Spring

Guía de DirtiesContext en Spring

Guía de DirtiesContext en Spring


En esta nueva entrada sobre Guía de DirtiesContext en Spring vamos a ver el uso de la anotación @DirtiesContext para nuestras aplicaciones en Spring.

¿Qué es la anotación @DirtiesContext?

La anotación @DirtiesContext es una anotación proporcionada para pruebas con la dependencia de Test de Spring. Esta anotación se utiliza para indicar que un contexto de Spring debe ser marcado como «sucio» o «ensuciado» después de que se haya ejecutado un método de prueba.

Cuando se ejecutan pruebas en un entorno de pruebas de Spring, a menudo se crea un contexto de Spring que contiene los objetos y configuraciones necesarios para las pruebas. Sin embargo, en algunos casos, un test puede modificar el estado del contexto de Spring de tal manera que afecte la ejecución de otros test que se ejecutan.

La anotación @DirtiesContext se utiliza en estos casos para indicar que el contexto de Spring debe ser reiniciado o recreado después de la ejecución del método de prueba actual. Esto asegura que cada test se ejecute en un contexto de Spring limpio e independiente, evitando posibles interferencias entre las pruebas.

La anotación @DirtiesContext se puede aplicar a nivel de método o a nivel de clase. Al aplicarla a nivel de método, solo el método de prueba actual provoca el reinicio del contexto. Al aplicarla a nivel de clase, todos los métodos de prueba en esa clase causarán el reinicio del contexto.

Fases en las que aplicar DirtiesContext

La anotación @DirtiesContext puede ser aplicado en diferentes momentos de nuestros Test en Spring Boot. También lo podemos aplicar a nivel de método o clase. Vamos a echar un ojo a las diferentes posibilidades:

Aplicar @DirtiesContext a nivel de clase

Cuando queremos aplicar @DirtiesContext a nivel de clase tenemos las siguientes opciones:

  • BEFORE_CLASSAntes de la clase actual
  • BEFORE_EACH_TEST_METHODAntes de cada método
  • AFTER_EACH_TEST_METHODDespués de cada método
  • AFTER_CLASSDespués de la clase.

@DirtiesContext a nivel de método

The example above shows the after current test method phase. Let’s do a quick summary of the phases:

  • BEFORE_METHODAntes del método
  • AFTER_METHOD: Después del método.

Utilización de @DirtiesContext

Cuando estamos realizando Test en de nuestra aplicación en muchas ocasiones necesitamos que después de cada test se limpie el contexto para poder realizar unas pruebas con el contexto limpio. Para esos casos haremos uso de @DirtiesContext. Vamos a ver un ejemplo en el que no hacemos uso de @DirtiesContext y como aplicar después @DirtiesContext.

Tenemos una clase que permite añadir coches a una lista y un método que devuelve todos los coches. Vamos a ejecutar un test en el que añadimos un coche y otro test en el que obtenemos el listado de los coches.

El código quedaría de la siguiente manera:

@Getter
@Setter
@ToString
public class Car() {

   private UUID id;

   private String brand;

   private String color;

}
@Slf4j
public class StoreCar() {

   public List<Car> cars;

   public void addCar(Car car) {
    
      cars.add(car);
 
   }

   public List<Car> getCars() {

   return cars;
  
  }

}

A continuación vamos a ejecutar dos test y en esos test vemos como la lista de cars permanece inalterada:

@Test
@Order(1)
public void given_car_then_store_new_car() {
    Car car = new Car();
    car.setBrand("Ford");
    storeCar.addCar(car);

    Assertions.assertTrue(storeCar().getCars().size == 1);
}

@Test
@Order(2)
public void getCarSize() {
     List<Car> cars = storeCar().getCars();

    Assertions.assertTrue(cars.size == 1);

}

Pero si queremos que la lista de cars y el contexto se inicialice antes de cada test deberíamos añadir @DirtiesContext, por ejemplo podríamos hacer lo siguiente:

@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
@Test
@Order(3)
void getCarSizeAfterDirtiesContext() {
     List<Car> cars = storeCar().getCars();

    Assertions.assertTrue(cars.size == 0);
}

Al añadir @DirtiesContext a nivel de método justo antes del test se inicializa el contexto. Por lo que la lista de coches será 0.

Conclusión

En esta Guía de DirtiesContext en Spring hemos visto el uso de la anotación de Spring y como nos puede ayudar en nuestros test con Spring Boot.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *