Sfida: Test Unitari
Compito
Siamo quasi alla fine di questo corso e, per concludere la nostra applicazione, ti propongo di completare la scrittura di tutti i test unitari per i livelli di controller e service.
Spiegazione del Compito
È necessario testare tutti i metodi sia nei livelli di controller che di service che non hanno ancora test scritti. Per questo, si consiglia di utilizzare JUnit insieme alla libreria Mockito.
Linee Guida per la Scrittura dei Test con JUnit
Ecco alcuni metodi chiave che saranno utili:
assertNotNull(result): Garantisce che il risultato di una chiamata a un metodo non sia null, confermando che l'operazione è stata eseguita con successo;
assertEquals(expected, actual): Confronta il valore atteso con il valore effettivo per verificare che siano restituiti i dati corretti;
assertTrue(condition): Verifica che una condizione sia vera, ad esempio, assicurandosi che una lista di libri sia vuota se non ci sono record nel database;
verify(mock).methodCall(): Verifica che un determinato metodo su un oggetto mock sia stato chiamato con i parametri attesi, validando l'interazione tra i componenti;
when(mock.methodCall()).thenReturn(value): Configura un mock per restituire un determinato valore quando viene chiamato un metodo, simulando le dipendenze nei tuoi test.
Test dei Controller
Qui, i test sono già stati scritti per i metodi findAllBooks, findByAuthor, createBook e updateBook. Sarà necessario scrivere i test per il metodo rimanente. Di seguito sono riportati alcuni suggerimenti per aiutarti a implementare il test per questo metodo.
deleteBooks(String id)
Per il metodo deleteBooks(String id), è necessario verificare che il metodo di eliminazione venga chiamato con l'id corretto e testare la gestione degli errori quando si tenta di eliminare un libro inesistente. Per una risposta positiva, controllare solo lo status; per gli errori, verificare sia lo status che il messaggio di errore.
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); }
Per il controller, sarà necessario scrivere due test per questo metodo: uno per la cancellazione riuscita e un altro per il caso in cui venga restituito uno 404 status.
Ricorda che il metodo del service che andremo a mockare non restituisce nulla, proprio come il controller.
È possibile utilizzare il metodo doNothing() per simulare un metodo void, assicurando che nessuna azione venga eseguita alla sua invocazione. La sintassi è:
doNothing().when(someService).someVoidMethod();
Quando è necessario gestire uno scenario in cui viene lanciata un'eccezione, utilizzare doThrow(). Questo metodo in Mockito simula il lancio di un'eccezione da un metodo void. La sintassi è:
doThrow(new ApiException(messageException, HttpStatus.NOT_FOUND)).when(bookService).deleteBook("1");
Test del Service
deleteBook(String id)
Il metodo deleteBook(String id) richiede una validazione per verificare che il metodo di cancellazione del libro venga chiamato con l'id corretto. Inoltre, è essenziale testare come il metodo gestisce la situazione in cui un libro con l'id specificato non viene trovato.
Sarà necessario implementare due test: uno in cui l'entità viene trovata tramite id e cancellata, e un altro in cui viene lanciata un'eccezione.
Cosa fare se non riesci a scrivere i test?
È assolutamente normale se non hai compreso l'argomento al primo tentativo; potrebbe essere necessario rileggere i concetti sui test. Si consiglia inoltre di consultare la soluzione di questo esercizio.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Awesome!
Completion rate improved to 3.45
Sfida: Test Unitari
Scorri per mostrare il menu
Compito
Siamo quasi alla fine di questo corso e, per concludere la nostra applicazione, ti propongo di completare la scrittura di tutti i test unitari per i livelli di controller e service.
Spiegazione del Compito
È necessario testare tutti i metodi sia nei livelli di controller che di service che non hanno ancora test scritti. Per questo, si consiglia di utilizzare JUnit insieme alla libreria Mockito.
Linee Guida per la Scrittura dei Test con JUnit
Ecco alcuni metodi chiave che saranno utili:
assertNotNull(result): Garantisce che il risultato di una chiamata a un metodo non sia null, confermando che l'operazione è stata eseguita con successo;
assertEquals(expected, actual): Confronta il valore atteso con il valore effettivo per verificare che siano restituiti i dati corretti;
assertTrue(condition): Verifica che una condizione sia vera, ad esempio, assicurandosi che una lista di libri sia vuota se non ci sono record nel database;
verify(mock).methodCall(): Verifica che un determinato metodo su un oggetto mock sia stato chiamato con i parametri attesi, validando l'interazione tra i componenti;
when(mock.methodCall()).thenReturn(value): Configura un mock per restituire un determinato valore quando viene chiamato un metodo, simulando le dipendenze nei tuoi test.
Test dei Controller
Qui, i test sono già stati scritti per i metodi findAllBooks, findByAuthor, createBook e updateBook. Sarà necessario scrivere i test per il metodo rimanente. Di seguito sono riportati alcuni suggerimenti per aiutarti a implementare il test per questo metodo.
deleteBooks(String id)
Per il metodo deleteBooks(String id), è necessario verificare che il metodo di eliminazione venga chiamato con l'id corretto e testare la gestione degli errori quando si tenta di eliminare un libro inesistente. Per una risposta positiva, controllare solo lo status; per gli errori, verificare sia lo status che il messaggio di errore.
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); }
Per il controller, sarà necessario scrivere due test per questo metodo: uno per la cancellazione riuscita e un altro per il caso in cui venga restituito uno 404 status.
Ricorda che il metodo del service che andremo a mockare non restituisce nulla, proprio come il controller.
È possibile utilizzare il metodo doNothing() per simulare un metodo void, assicurando che nessuna azione venga eseguita alla sua invocazione. La sintassi è:
doNothing().when(someService).someVoidMethod();
Quando è necessario gestire uno scenario in cui viene lanciata un'eccezione, utilizzare doThrow(). Questo metodo in Mockito simula il lancio di un'eccezione da un metodo void. La sintassi è:
doThrow(new ApiException(messageException, HttpStatus.NOT_FOUND)).when(bookService).deleteBook("1");
Test del Service
deleteBook(String id)
Il metodo deleteBook(String id) richiede una validazione per verificare che il metodo di cancellazione del libro venga chiamato con l'id corretto. Inoltre, è essenziale testare come il metodo gestisce la situazione in cui un libro con l'id specificato non viene trovato.
Sarà necessario implementare due test: uno in cui l'entità viene trovata tramite id e cancellata, e un altro in cui viene lanciata un'eccezione.
Cosa fare se non riesci a scrivere i test?
È assolutamente normale se non hai compreso l'argomento al primo tentativo; potrebbe essere necessario rileggere i concetti sui test. Si consiglia inoltre di consultare la soluzione di questo esercizio.
Grazie per i tuoi commenti!