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.