DEV Community

Cover image for Testes Unitários com JUnit
pedro-henrique-arruzzo
pedro-henrique-arruzzo

Posted on

Testes Unitários com JUnit

Testes são extremamente necessários em qualquer aplicação para garantir sua funcionalidade durante seu desenvolvimento. Esses testes devem ser feitos de forma simples e rápida, para que possam ser executados várias vezes sem levar muito tempo. Além disso, devem ser independentes, ou seja, um teste não deve afetar o outro. E também, deve ser possível repeti-los sempre que for preciso.
Estes testes devem abranger todos os cenários possíveis que a aplicação será usada.

Por exemplo, sua aplicação oferece um serviço de locação de filmes. Seus testes devem simular este serviço em diversas situações diferentes, ou seja, com diferentes quantidades de produtos, preços diferentes e etc.

Agora vamos falar um pouco sobre o JUnit, que é a principal ferramenta para a execução de testes unitários.

JUnit é um framework extremamente importante, pois, com ele, podemos criar testes para verificar funcionalidades de classes e seus métodos. Além disso, ele é responsável por automatizar a execução destes testes. Desta maneira, sempre que houver alguma alteração no código, os testes serão executados para garantir a integridade da aplicação.

Exemplo:

Criei um código simples de um serviço de locação de filmes, e quero realizar um teste.

Três entidades foram criadas: Filme, Locacao, e Usuario.

LocacaoService:

    public Locacao alugarFilme(Usuario usuario, List<Filme> filmes) 
            throws FilmeSemEstoqueException, LocadoraException {
        if(usuario == null) {
            throw new LocadoraException("Usuario vazio");
        }

        if(filmes == null || filmes.isEmpty()) {
            throw new LocadoraException("Filme vazio");
        }

        for (Filme filme: filmes) {
            if (filme.getEstoque() == 0) {
                throw new FilmeSemEstoqueException();
            }
        }

        Locacao locacao = new Locacao();
        locacao.setFilmes(filmes);
        locacao.setUsuario(usuario);
        locacao.setDataLocacao(new Date());
        Double valorTotal = 0d;
        for (Filme filme:filmes){
            valorTotal += filme.getPrecoLocacao();
        }
        locacao.setValor(valorTotal);

        //Entrega no dia seguinte
        Date dataEntrega = new Date();
        dataEntrega = adicionarDias(dataEntrega, 1);
        locacao.setDataRetorno(dataEntrega);

        return locacao;
    }

Enter fullscreen mode Exit fullscreen mode

Agora com as entidades e os serviços criados podemos fazer os testes.

@Test
public void testeLocacao() throws Exception {
    //given
    Usuario usuario = new Usuario("Usuario 1");
    List<Filme> filmes = Arrays.asList(new Filme("Filme 1", 1, 5.0));

    //when
    Locacao locacao = service.alugarFilme(usuario, filmes);

    //then
    error.checkThat(locacao.getValor(), is(equalTo(5.0)));
    error.checkThat(isMesmaData(locacao.getDataLocacao(), new Date()), is(true));
    error.checkThat(isMesmaData(locacao.getDataRetorno(), obterDataComDiferencaDias(1)), is(true));
}
Enter fullscreen mode Exit fullscreen mode

Primeiro nós devemos criar o cenário do teste, iniciando as entidades e dando a elas um valor, chamamos isso de "Given".

Usuario usuario = new Usuario("Usuario 1");
List<Filme> filmes = Arrays.asList(new Filme("Filme 1", 1, 5.0));
Enter fullscreen mode Exit fullscreen mode

Com o cenário criado faremos a ação que desejamos testar, neste caso, alugar um filme, chamamos isso de "When".

Locacao locacao = service.alugarFilme(usuario, filmes);
Enter fullscreen mode Exit fullscreen mode

Por fim, é necessário verificar se tudo está do jeito certo, chamamos isso de "Then".

error.checkThat(locacao.getValor(), is(equalTo(5.0)));
error.checkThat(isMesmaData(locacao.getDataLocacao(), new Date()), is(true));
error.checkThat(isMesmaData(locacao.getDataRetorno(),obterDataComDiferencaDias(1)), is(true));
Enter fullscreen mode Exit fullscreen mode

Conclusão

Com isso é possível criar testes em diversos cenários e ter certeza que sua aplicação não ira quebrar caso haja algum tipo de alteração no código.

Caso esteja interessado, o código está no GitHub

Discussion (0)