Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Uitdaging: Unit Testing | Backendapplicaties Testen
Spring Boot Backend

bookUitdaging: Unit Testing

Taak

We naderen het einde van deze cursus, en om onze applicatie af te ronden, stel ik voor dat je alle unit tests voor de controller- en service-lagen afmaakt.

Uitleg van de taak

Je dient alle methoden in zowel de controller- als service-lagen te testen waarvoor nog geen tests zijn geschreven. Hiervoor raad ik aan om JUnit samen met de Mockito-bibliotheek te gebruiken.

Richtlijnen voor het schrijven van tests met JUnit

Hier zijn enkele belangrijke methoden die nuttig zijn:

assertNotNull(result): Zorgt ervoor dat het resultaat van een methode-aanroep niet null is, waarmee wordt bevestigd dat de operatie geslaagd is;

assertEquals(expected, actual): Vergelijkt de verwachte waarde met de werkelijke waarde om te controleren of de juiste gegevens worden teruggegeven;

assertTrue(condition): Controleert of een voorwaarde waar is, bijvoorbeeld of een lijst van boeken leeg is als er geen records in de database staan;

verify(mock).methodCall(): Verifieert dat een specifieke methode op een mock-object is aangeroepen met de verwachte parameters, waarmee de interactie tussen componenten wordt gevalideerd;

when(mock.methodCall()).thenReturn(value): Configureert een mock om een bepaalde waarde terug te geven wanneer een methode wordt aangeroepen, waarmee afhankelijkheden in je tests worden gesimuleerd.

Controller testen

Hier zijn er al tests geschreven voor de methoden findAllBooks, findByAuthor, createBook en updateBook. Je moet nu tests schrijven voor de resterende methode. Hieronder vind je enkele tips om je te helpen bij het implementeren van de test voor deze methode.

deleteBooks(String id)

Voor de methode deleteBooks(String id) moet je verifiëren dat de delete-methode wordt aangeroepen met het juiste id en de foutafhandeling testen wanneer geprobeerd wordt een niet-bestaand boek te verwijderen. Controleer bij een succesvolle respons alleen de status; bij fouten controleer je zowel de status als het foutbericht.

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); }

Voor de controller moet u twee tests schrijven voor deze methode: één voor de succesvolle verwijdering en een andere voor wanneer een 404 status wordt geretourneerd.

Houd er rekening mee dat de servicemethode die we zullen mocken niets retourneert, net als de controller.

U kunt de doNothing()-methode gebruiken om een void-methode te stubbben, zodat geen acties worden uitgevoerd bij het aanroepen ervan. De syntaxis is:

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

Wanneer u een scenario moet afhandelen waarin een exceptie wordt opgegooid, gebruikt u doThrow(). Deze methode in Mockito simuleert het gooien van een exceptie vanuit een void-methode. De syntaxis is:

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

Service Testing

deleteBook(String id)

De deleteBook(String id)-methode vereist validatie om te garanderen dat de boekverwijderingsmethode wordt aangeroepen met de juiste id. Daarnaast is het essentieel om te testen hoe de methode omgaat met de situatie waarin een boek met de opgegeven id niet wordt gevonden.

U moet twee tests implementeren: één waarbij de entiteit wordt gevonden op id en verwijderd, en een andere waarbij een exceptie wordt opgegooid.

Wat als je geen tests kunt schrijven?

Het is volledig acceptabel als je het onderwerp niet direct begreep; het kan nodig zijn om de testconcepten opnieuw te lezen. Het is ook aan te raden om de oplossing van deze opdracht te bekijken.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 4

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

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

bookUitdaging: Unit Testing

Veeg om het menu te tonen

Taak

We naderen het einde van deze cursus, en om onze applicatie af te ronden, stel ik voor dat je alle unit tests voor de controller- en service-lagen afmaakt.

Uitleg van de taak

Je dient alle methoden in zowel de controller- als service-lagen te testen waarvoor nog geen tests zijn geschreven. Hiervoor raad ik aan om JUnit samen met de Mockito-bibliotheek te gebruiken.

Richtlijnen voor het schrijven van tests met JUnit

Hier zijn enkele belangrijke methoden die nuttig zijn:

assertNotNull(result): Zorgt ervoor dat het resultaat van een methode-aanroep niet null is, waarmee wordt bevestigd dat de operatie geslaagd is;

assertEquals(expected, actual): Vergelijkt de verwachte waarde met de werkelijke waarde om te controleren of de juiste gegevens worden teruggegeven;

assertTrue(condition): Controleert of een voorwaarde waar is, bijvoorbeeld of een lijst van boeken leeg is als er geen records in de database staan;

verify(mock).methodCall(): Verifieert dat een specifieke methode op een mock-object is aangeroepen met de verwachte parameters, waarmee de interactie tussen componenten wordt gevalideerd;

when(mock.methodCall()).thenReturn(value): Configureert een mock om een bepaalde waarde terug te geven wanneer een methode wordt aangeroepen, waarmee afhankelijkheden in je tests worden gesimuleerd.

Controller testen

Hier zijn er al tests geschreven voor de methoden findAllBooks, findByAuthor, createBook en updateBook. Je moet nu tests schrijven voor de resterende methode. Hieronder vind je enkele tips om je te helpen bij het implementeren van de test voor deze methode.

deleteBooks(String id)

Voor de methode deleteBooks(String id) moet je verifiëren dat de delete-methode wordt aangeroepen met het juiste id en de foutafhandeling testen wanneer geprobeerd wordt een niet-bestaand boek te verwijderen. Controleer bij een succesvolle respons alleen de status; bij fouten controleer je zowel de status als het foutbericht.

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); }

Voor de controller moet u twee tests schrijven voor deze methode: één voor de succesvolle verwijdering en een andere voor wanneer een 404 status wordt geretourneerd.

Houd er rekening mee dat de servicemethode die we zullen mocken niets retourneert, net als de controller.

U kunt de doNothing()-methode gebruiken om een void-methode te stubbben, zodat geen acties worden uitgevoerd bij het aanroepen ervan. De syntaxis is:

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

Wanneer u een scenario moet afhandelen waarin een exceptie wordt opgegooid, gebruikt u doThrow(). Deze methode in Mockito simuleert het gooien van een exceptie vanuit een void-methode. De syntaxis is:

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

Service Testing

deleteBook(String id)

De deleteBook(String id)-methode vereist validatie om te garanderen dat de boekverwijderingsmethode wordt aangeroepen met de juiste id. Daarnaast is het essentieel om te testen hoe de methode omgaat met de situatie waarin een boek met de opgegeven id niet wordt gevonden.

U moet twee tests implementeren: één waarbij de entiteit wordt gevonden op id en verwijderd, en een andere waarbij een exceptie wordt opgegooid.

Wat als je geen tests kunt schrijven?

Het is volledig acceptabel als je het onderwerp niet direct begreep; het kan nodig zijn om de testconcepten opnieuw te lezen. Het is ook aan te raden om de oplossing van deze opdracht te bekijken.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 4
some-alt