Criando Sua Faca Suíça em Java Test Stack

As garantias de testabilidade garantem vários pontos excelentes em um design de código eficiente, como manutenibilidade; auxilia na documentação e torna mais fácil refatorar e construir um design/arquitetura evolutiva. Não há dúvida sobre isso, mas qual é uma boa pilha de testes para começar um projeto? Este vídeo explicará a pilha mínima de testes para iniciar seu projeto com Java.

O primeiro ponto a entender quando falamos sobre o mínimo é que não há balas de prata na pilha de testes. Eventualmente, precisamos incluir ou remover dependências, especialmente quando falamos de código legado. Dado isso, vou dar o que é a minha pilha de testes favorita em Java, e eu a utilizo e recomendo como mínimo para começar do zero:

  • JUnit-Jupiter: A quinta versão do JUnit rompe a compatibilidade com a versão anterior; no entanto, vale a pena porque traz várias funcionalidades, principalmente para criar extensões personalizadas.

  • Mockito: Um framework de mock super popular com Java. Essa popularidade e grande comunidade permitem várias extensões, como com JUnit-Jupiter.

  • AssertJ: Se você ama API fluente como eu, então, AssertJ é uma biblioteca extravagante para você.

Usando o projeto Maven, você pode adicionar as dependências dessas bibliotecas:

XML

 

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>${mockito.verson}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>${mockito.verson}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>${assertj.verson}</version>
    <scope>test</scope>
</dependency>

Dado um contexto de campeonato de futebol, onde temos uma equipe que deve ter onze jogadores, cada nome deve ser único no campeonato. Podemos explorar testes sobre isso.

Começando com JMockito e teste, precisamos testar o serviço onde precisamos verificar se o nome existe no banco de dados para proceder com a lógica. Neste ponto, não precisamos e não queremos criar um teste de integração. 

Queremos nos concentrar no negócio, então não queremos testar o banco de dados ou o framework, mas apenas o meu código. Então, vamos simular o repositório com duas situações, quando há o nome e quando não há.

Usando Mockito integrado com JUnit-Jupiter, você pode injetar mock apenas usando anotações. O código abaixo mostra o teste usando JMockito, onde não precisamos ter um banco de dados ou sair do foco para testar o negócio.

Java

 

@ExtendWith(MockitoExtension.class)
class ChampionshipServiceTest {

    @Mock
    private ChampionRepository repository;

    @InjectMocks
    private ChampionshipService service;

    @Test
    public void shouldRegister() {
        Mockito.when(repository.existByName("Bahia")).thenReturn(false);
        Team bahia = Team.of("Bahia");
        service.register(bahia);

        Mockito.verify(repository).existByName("Bahia");
    }
    @Test
    @DisplayName("should return an exception when there is a team with a name")
    public void shouldThrownAnExceptionWhenTeamNameExists() {
        Mockito.when(repository.existByName("Bahia")).thenReturn(true);
        Team bahia = Team.of("Bahia");
        Assertions.assertThrows(IllegalArgumentException.class, () ->
                service.register(bahia));

        Mockito.verify(repository).existByName("Bahia");
    }
}

O AssertJ torna as asserções mais fáceis de entender, graças à API fluente que a biblioteca suporta. Você pode testar coleções, mapas ou uma única instância. Por exemplo, podemos verificar a adição de um jogador à equipe usando-o.

Java

 

@Test
public void shouldCreatePlayers() {
    Team bahia = Team.of("Bahia");
    bahia.add(Player.of("Neymar", "Santos", 10));
    bahia.add(Player.of("Cristiano Ronaldo", "Lisbon", 10));

    org.assertj.core.api.Assertions.assertThat(bahia.players())
            .hasSize(2)
            .map(Player::name)
            .contains("Neymar", "Cristiano Ronaldo");
}

Confira este e mais informações neste vídeo.

Principais aprendizados:

  • A minimum test stack to start Java

  • Aprenda mais sobre o JUnit e por que é uma boa escolha

  • Explore mocks com o JMockito

  • Deixe seus testes bonitos com a API fluente Assert: AssertJ

Source:
https://dzone.com/articles/creating-your-swiss-army-knife-on-java-test-stack