Um guia rápido para @DirtiesContext
1. Visão geral
Neste tutorial rápido, aprenderemos sobre a anotação@DirtiesContext. Também mostraremos uma maneira padrão de usar a anotação para teste.
2. @DirtiesContext
@DirtiesContext é umSpring testing annotation. Indica que o teste ou classe associada modifica oApplicationContext. Diz à estrutura de teste para fechar e recriar o contexto para testes posteriores.
Podemos anotar um método de teste ou uma classe inteira. DefinindoMethodMode ouClassMode,we can control when Spring marks the context for closure.
Se colocarmos@DirtiesContext em uma classe, a anotação se aplica a todos os métodos da classe com oClassMode. fornecido
3. Testando sem limpar o contexto da primavera
Digamos que temos umUser:
public class User {
String firstName;
String lastName;
}
Também temos umUserCache: muito simples
@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);
}
}
Criamos um teste de integração para carregar e testar o aplicativo completo:
@TestMethodOrder(OrderAnnotation.class)
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = SpringDataRestApplication.class)
class DirtiesContextIntegrationTest {
@Autowired
protected UserCache userCache;
...
}
O primeiro método,addJaneDoeAndPrintCache, adiciona uma entrada ao cache:
@Test
@Order(1)
void addJaneDoeAndPrintCache() {
userCache.addUser("Jane Doe");
userCache.printUserList("addJaneDoeAndPrintCache");
}
Depois de adicionar um usuário ao cache, ele imprime o conteúdo do cache:
addJaneDoeAndPrintCache: [Jane Doe]
Em seguida,printCache imprime o cache do usuário novamente:
@Test
@Order(2)
void printCache() {
userCache.printUserList("printCache");
}
Ele contém o nome adicionado no teste anterior:
printCache: [Jane Doe]
Digamos que um teste posterior estava contando com um cache vazio para algumas afirmações. Os nomes inseridos anteriormente podem causar comportamento indesejado.
4. Usando@DirtiesContext
Agora vamos mostrar@DirtiesContext com o padrãoMethodMode,AFTER_METHOD. Isso significa que o Spring marcará o contexto para fechamento após a conclusão do método de teste correspondente.
Para isolar as alterações em um teste, adicionamos@DirtiesContext. Vamos ver como isso funciona.
O método de testeaddJohnDoeAndPrintCache adiciona um usuário ao cache. Também adicionamos a anotação@DirtiesContext, que diz que o contexto deve ser encerrado no final do método de teste:
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
@Test
@Order(3)
void addJohnDoeAndPrintCache() {
userCache.addUser("John Doe");
userCache.printUserList("addJohnDoeAndPrintCache");
}
A saída é agora:
addJohnDoeAndPrintCache: [John Doe, Jane Doe]
Finalmente, printCacheAgain imprime o cache novamente:
@Test
@Order(4)
void printCacheAgain() {
userCache.printUserList("printCacheAgain");
}
Executando a classe de teste completa, vemos o contexto do Spring recarregar entreaddJohnDoeAndPrintCacheeprintCacheAgain. Portanto, o cache é reinicializado e a saída está vazia:
printCacheAgain: []
5. Outras fases de teste suportadas
O exemplo acima mostra a faseafter current test method. Vamos fazer um rápido resumo das fases:
5.1. Nível de classe
The ClassMode options for a test class define when the context is reset:
-
BEFORE_CLASS: Antes da aula de teste atual
-
BEFORE_EACH_TEST_METHOD: Antes de cada método de teste na classe de teste atual
-
AFTER_EACH_TEST_METHOD: Após cada método de teste na classe de teste atual
-
AFTER_CLASS: Após a aula de teste atual
5.2. Nível do método
The MethodMode options for an individual method define when the context is reset:
-
BEFORE_METHOD: Antes do método de teste atual
-
AFTER_METHOD: Após o método de teste atual
6. Conclusão
Neste artigo, apresentamos a anotação de teste@DirtiesContext.
Como sempre, o código de exemplo está disponívelover on GitHub.