Una guía rápida de @DirtiesContext

1. Información general

En este tutorial rápido, aprenderemos sobre la anotación @DirtiesContext . También mostraremos una forma estándar de usar la anotación para realizar pruebas.

2. @DirtiesContext

@DirtiesContext es una anotación de prueba de Spring . Indica que la prueba o clase asociada modifica el ApplicationContext . Le dice al marco de prueba que cierre y vuelva a crear el contexto para pruebas posteriores.

Podemos anotar un método de prueba o una clase completa. Al establecer MethodMode o ClassMode , podemos controlar cuándo Spring marca el contexto para el cierre .

Si colocamos @DirtiesContext en una clase, la anotación se aplica a todos los métodos de la clase con el ClassMode dado .

3. Prueba sin aclarar el contexto de primavera

Digamos que tenemos un usuario :

public class User { String firstName; String lastName; }

También tenemos un UserCache muy simple :

@Component public class UserCache { @Getter private Set userList = new HashSet(); public boolean addUser(String user) { return userList.add(user); } public void printUserList(String message) { System.out.println(message + ": " + userList); } }

Creamos una prueba de integración para cargar y probar la aplicación completa:

@TestMethodOrder(OrderAnnotation.class) @ExtendWith(SpringExtension.class) @SpringBootTest(classes = SpringDataRestApplication.class) class DirtiesContextIntegrationTest { @Autowired protected UserCache userCache; ... }

El primer método, addJaneDoeAndPrintCache , agrega una entrada a la caché:

@Test @Order(1) void addJaneDoeAndPrintCache() { userCache.addUser("Jane Doe"); userCache.printUserList("addJaneDoeAndPrintCache"); }

Después de agregar un usuario a la caché, imprime el contenido de la caché:

addJaneDoeAndPrintCache: [Jane Doe]

A continuación, printCache imprime el caché del usuario nuevamente:

@Test @Order(2) void printCache() { userCache.printUserList("printCache"); }

Contiene el nombre agregado en la prueba anterior:

printCache: [Jane Doe]

Digamos que una prueba posterior se basó en un caché vacío para algunas afirmaciones. Los nombres insertados anteriormente pueden causar un comportamiento no deseado.

4. Usando @DirtiesContext

Ahora mostraremos @DirtiesContext con el MethodMode predeterminado , AFTER_METHOD . Esto significa que Spring marcará el contexto para el cierre después de que se complete el método de prueba correspondiente.

Para aislar los cambios en una prueba, agregamos @DirtiesContext . Vamos a ver cómo funciona.

El método de prueba addJohnDoeAndPrintCache agrega un usuario a la caché. También hemos agregado la anotación @DirtiesContext , que dice que el contexto debería cerrarse al final del método de prueba:

@DirtiesContext(methodMode = MethodMode.AFTER_METHOD) @Test @Order(3) void addJohnDoeAndPrintCache() { userCache.addUser("John Doe"); userCache.printUserList("addJohnDoeAndPrintCache"); }

La salida es ahora:

addJohnDoeAndPrintCache: [John Doe, Jane Doe]

Finalmente, printCacheAgain imprime el caché nuevamente:

@Test @Order(4) void printCacheAgain() { userCache.printUserList("printCacheAgain"); }

Al ejecutar la clase de prueba completa, vemos la recarga del contexto Spring entre addJohnDoeAndPrintCache y printCacheAgain . Entonces, la caché se reinicializa y la salida está vacía:

printCacheAgain: []

5. Otras fases de prueba admitidas

El ejemplo anterior muestra la fase posterior al método de prueba actual . Hagamos un resumen rápido de las fases:

5.1. Nivel de clase

Las opciones de ClassMode para una clase de prueba definen cuándo se restablece el contexto :

  • BEFORE_CLASS: antes de la clase de prueba actual
  • BEFORE_EACH_TEST_METHOD: antes de cada método de prueba en la clase de prueba actual
  • AFTER_EACH_TEST_METHOD: después de cada método de prueba en la clase de prueba actual
  • AFTER_CLASS: después de la clase de prueba actual

5.2. Nivel de método

Las opciones de MethodMode para un método individual definen cuándo se restablece el contexto :

  • BEFORE_METHOD: antes del método de prueba actual
  • AFTER_METHOD : después del método de prueba actual

6. Conclusión

En este artículo, presentamos la anotación de prueba @DirtiesContext .

Como siempre, el código de ejemplo está disponible en GitHub.