Um guia rápido para @DirtiesContext

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.