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, 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
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.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
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
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, 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
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.
Obrigado pelo seu feedback!