TDD e testes com Mocks

TDD

Test Driven Development é uma maneira de desenvolver o seu código onde o teste é criado antes da alteração/criação do código. Isso é feito para que o desenvolvimento tenha a garantia de sua funcionalidade.

O teste deve ser a primeira coisa a ser feita para que o código seja desenvolvido em volta desse teste para que, ao final do desenvolvimento, o mesmo esteja funcionando, provando que o código funciona.

Uma boa maneira de realizar estes testes é utilizando o Mockito.

Mockito

Mockito é um framework de mocking que é frequentemente usado em
testes de unidade. Mockar um objeto é simular o seu comportamento. Ao criar esta simulação, fica possível realizar um teste sem precisar chamar um objeto complexo, chamamos apenas o mock.

Exemplos

É necessário iniciar os mocks antes dos testes.

@Before
public void setup(){
    service = new RentService();
    RentDAO dao = Mockito.mock(RentDAO.class);
    service.setRentDao(dao);
    spcService = Mockito.mock(SPCService.class);
    service.setSpcService(spcService);
}

Estou simulando as interfaces RentDAO e SPCService com o Mockito.

RentDAO: public void save(Rent rent);
SPCService: public boolean isNegative(User user);

Com isso podemos realizar o teste chamando o mock.

@Test
public void rentTest() throws Exception {
    //given
    User user = UserBuilder.aUser().now();
    List<Movie> movies = Arrays.asList(MovieBuilder.aMovie().withValue(5.0).now());

    //when
    Rent rent = service.rentMovie(user, movies);

    //then
    error.checkThat(rent.getValue(), is(equalTo(5.0)));
    error.checkThat(DataUtils.isSameDate(rent.getRentDate(), new Date()), is(true));
    error.checkThat(DataUtils.isSameDate(rent.getReturnDate(), DataUtils.obtainDataInDifferenceInDays(1)), is(true));
}

Neste teste, um usuário e um filme foram iniciados e o serviço de locação foi mockado.

Conclusão

Desta maneira, é possível testar se o serviço de locação funciona sem fazer, de fato, uma locação.
Isso é útil para evitar, por exemplo, idas desnecessárias ao banco de dados, basta mockar o objeto que faz a chamada.

Caso esteja interessado, aqui está o repositório no GitHub com mais testes mockados: https://github.com/pedro-henrique-arruzzo/poc/tree/main/MockTests

15