Desafio: 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, recomenda-se utilizar JUnit juntamente com a biblioteca Mockito.
Diretrizes para Escrita de Testes com JUnit
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 se não houver 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 componentes;
when(mock.methodCall()).thenReturn(value): Configura um mock para retornar um determinado valor quando um método for chamado, simulando dependências nos 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
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, é 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 invocado. A sintaxe é:
doNothing().when(someService).someVoidMethod();
Quando for necessário lidar com um cenário em que uma exceção é lançada, utilize doThrow(). Este método no 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 entendeu o assunto na primeira tentativa; pode ser necessário reler os conceitos de teste. Também recomendo revisar a solução deste exercício.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 3.45
Desafio: 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, recomenda-se utilizar JUnit juntamente com a biblioteca Mockito.
Diretrizes para Escrita de Testes com JUnit
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 se não houver 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 componentes;
when(mock.methodCall()).thenReturn(value): Configura um mock para retornar um determinado valor quando um método for chamado, simulando dependências nos 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
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, é 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 invocado. A sintaxe é:
doNothing().when(someService).someVoidMethod();
Quando for necessário lidar com um cenário em que uma exceção é lançada, utilize doThrow(). Este método no 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 entendeu o assunto na primeira tentativa; pode ser necessário reler os conceitos de teste. Também recomendo revisar a solução deste exercício.
Obrigado pelo seu feedback!