Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Desafio: Testes Unitários | Testando Aplicações Backend
Spring Boot Backend

bookDesafio: Testes Unitários

Tarefa

Estamos chegando ao final deste curso e, para concluir nossa aplicação, proponho que você termine de escrever todos os testes unitários para as camadas de controller e service.

Explicação da Tarefa

É necessário testar todos os métodos nas camadas de controller e service que ainda não possuem testes escritos. Para isso, recomendo utilizar o JUnit juntamente com a biblioteca Mockito.

Diretrizes para Escrita de Testes com JUnit

Aqui estão alguns métodos principais que serão úteis:

assertNotNull(result): Garante que o resultado de uma chamada de método não seja null, confirmando que a operação foi bem-sucedida;

assertEquals(expected, actual): Compara o valor esperado com o valor atual para verificar se os dados corretos foram retornados;

assertTrue(condition): Verifica se uma condição é verdadeira, por exemplo, garantindo que uma lista de livros esteja vazia caso não haja registros no banco de dados;

verify(mock).methodCall(): Verifica se um método específico em um objeto mock foi chamado com os parâmetros esperados, validando a interação entre os componentes;

when(mock.methodCall()).thenReturn(value): Configura um mock para retornar um determinado valor quando um método for chamado, simulando dependências em seus testes.

Teste do Controller

Aqui, os testes já foram escritos para os métodos findAllBooks, findByAuthor, createBook e updateBook. Será necessário escrever testes para o método restante. Abaixo estão algumas dicas para ajudar na implementação do teste para este método.

deleteBooks(String id)

Para o método deleteBooks(String id), é necessário verificar se o método de exclusão é chamado com o id correto e testar o tratamento de erros ao tentar excluir um livro inexistente. Para uma resposta bem-sucedida, verifique apenas o status; para erros, verifique tanto o status quanto a mensagem de erro.

BookService.java

BookService.java

copy
1234567
@Transactional public void deleteBook(String id) { if(!bookRepository.existsById(id)) { throw new ApiException("Not found by id: " + id, HttpStatus.NOT_FOUND); } bookRepository.deleteById(id); }

Para o controller, será necessário escrever dois testes para este método: um para a deleção bem-sucedida e outro para quando um 404 status é retornado.

Lembre-se de que o método do serviço que será mockado não retorna nada, assim como o controller.

É possível utilizar o método doNothing() para simular um método void, garantindo que nenhuma ação seja executada ao ser chamado. A sintaxe é:

doNothing().when(someService).someVoidMethod();

Quando for necessário lidar com um cenário em que uma exceção é lançada, utilize o doThrow(). Esse método do Mockito simula o lançamento de uma exceção a partir de um método void. A sintaxe é:

doThrow(new ApiException(messageException, HttpStatus.NOT_FOUND)).when(bookService).deleteBook("1");

Teste de Serviço

deleteBook(String id)

O método deleteBook(String id) requer validação para garantir que o método de deleção do livro seja chamado com o id correto. Além disso, é essencial testar como o método lida com a situação em que um livro com o id especificado não é encontrado.

Será necessário implementar dois testes: um em que a entidade é encontrada pelo id e deletada, e outro em que uma exceção é lançada.

E se você não conseguir escrever testes?

É totalmente normal se você não compreendeu o assunto na primeira tentativa; pode ser necessário reler os conceitos de teste. Também recomendo revisar a solução deste exercício.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 4

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Suggested prompts:

Can you explain how to write a test for the deleteBook method in the service layer?

What should I focus on when testing the controller's deleteBooks method?

Can you clarify how to use doThrow and doNothing in Mockito for these tests?

Awesome!

Completion rate improved to 3.45

bookDesafio: Testes Unitários

Deslize para mostrar o menu

Tarefa

Estamos chegando ao final deste curso e, para concluir nossa aplicação, proponho que você termine de escrever todos os testes unitários para as camadas de controller e service.

Explicação da Tarefa

É necessário testar todos os métodos nas camadas de controller e service que ainda não possuem testes escritos. Para isso, recomendo utilizar o JUnit juntamente com a biblioteca Mockito.

Diretrizes para Escrita de Testes com JUnit

Aqui estão alguns métodos principais que serão úteis:

assertNotNull(result): Garante que o resultado de uma chamada de método não seja null, confirmando que a operação foi bem-sucedida;

assertEquals(expected, actual): Compara o valor esperado com o valor atual para verificar se os dados corretos foram retornados;

assertTrue(condition): Verifica se uma condição é verdadeira, por exemplo, garantindo que uma lista de livros esteja vazia caso não haja registros no banco de dados;

verify(mock).methodCall(): Verifica se um método específico em um objeto mock foi chamado com os parâmetros esperados, validando a interação entre os componentes;

when(mock.methodCall()).thenReturn(value): Configura um mock para retornar um determinado valor quando um método for chamado, simulando dependências em seus testes.

Teste do Controller

Aqui, os testes já foram escritos para os métodos findAllBooks, findByAuthor, createBook e updateBook. Será necessário escrever testes para o método restante. Abaixo estão algumas dicas para ajudar na implementação do teste para este método.

deleteBooks(String id)

Para o método deleteBooks(String id), é necessário verificar se o método de exclusão é chamado com o id correto e testar o tratamento de erros ao tentar excluir um livro inexistente. Para uma resposta bem-sucedida, verifique apenas o status; para erros, verifique tanto o status quanto a mensagem de erro.

BookService.java

BookService.java

copy
1234567
@Transactional public void deleteBook(String id) { if(!bookRepository.existsById(id)) { throw new ApiException("Not found by id: " + id, HttpStatus.NOT_FOUND); } bookRepository.deleteById(id); }

Para o controller, será necessário escrever dois testes para este método: um para a deleção bem-sucedida e outro para quando um 404 status é retornado.

Lembre-se de que o método do serviço que será mockado não retorna nada, assim como o controller.

É possível utilizar o método doNothing() para simular um método void, garantindo que nenhuma ação seja executada ao ser chamado. A sintaxe é:

doNothing().when(someService).someVoidMethod();

Quando for necessário lidar com um cenário em que uma exceção é lançada, utilize o doThrow(). Esse método do Mockito simula o lançamento de uma exceção a partir de um método void. A sintaxe é:

doThrow(new ApiException(messageException, HttpStatus.NOT_FOUND)).when(bookService).deleteBook("1");

Teste de Serviço

deleteBook(String id)

O método deleteBook(String id) requer validação para garantir que o método de deleção do livro seja chamado com o id correto. Além disso, é essencial testar como o método lida com a situação em que um livro com o id especificado não é encontrado.

Será necessário implementar dois testes: um em que a entidade é encontrada pelo id e deletada, e outro em que uma exceção é lançada.

E se você não conseguir escrever testes?

É totalmente normal se você não compreendeu o assunto na primeira tentativa; pode ser necessário reler os conceitos de teste. Também recomendo revisar a solução deste exercício.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 4
some-alt