Kursinhalt
Spring Boot Backend
Spring Boot Backend
Herausforderung: Unit-Testing
Aufgabe
Wir nähern uns dem Ende dieses Kurses, und um unsere Anwendung abzuschließen, schlage ich vor, dass Sie alle Unit-Tests für die Controller- und Service-Schichten fertigstellen.
Aufgabenbeschreibung
Sie müssen alle Methoden in den Controller- und Service-Schichten testen, für die noch keine Tests geschrieben wurden. Dafür empfehle ich die Verwendung von JUnit
zusammen mit der Mockito
Bibliothek.
Richtlinien zum Schreiben von Tests mit JUnit
Hier sind einige wichtige Methoden, die Sie nützlich finden werden:
assertNotNull(result)
: Stellt sicher, dass das Ergebnis eines Methodenaufrufs nicht null
ist, was bestätigt, dass die Operation erfolgreich war;
assertEquals(expected, actual)
: Vergleicht den erwarteten Wert mit dem tatsächlichen Wert, um zu überprüfen, ob die korrekten Daten zurückgegeben werden;
assertTrue(condition)
: Überprüft, dass eine Bedingung wahr ist, zum Beispiel, um sicherzustellen, dass eine Liste von Büchern leer ist, wenn es keine Einträge in der Datenbank gibt;
verify(mock).methodCall()
: Überprüft, dass eine bestimmte Methode auf einem Mock-Objekt mit den erwarteten Parametern aufgerufen wurde, was die Interaktion zwischen Komponenten validiert;
when(mock.methodCall()).thenReturn(value)
: Konfiguriert einen Mock, um einen bestimmten Wert zurückzugeben, wenn eine Methode aufgerufen wird, und simuliert Abhängigkeiten in Ihren Tests.
Controller-Tests
Hier wurden bereits Tests für die Methoden findAllBooks
, findByAuthor
, createBook
und updateBook
geschrieben. Sie müssen Tests für die verbleibende Methode schreiben. Unten sind einige Tipps, die Ihnen helfen, den Test für diese Methode zu implementieren.
deleteBooks(String id)
Für die Methode deleteBooks(String id)
müssen Sie überprüfen, dass die Löschmethode mit der korrekten id
aufgerufen wird und die Fehlerbehandlung testen, wenn versucht wird, ein nicht vorhandenes Buch zu löschen. Für eine erfolgreiche Antwort überprüfen Sie nur den Status; bei Fehlern überprüfen Sie sowohl den Status als auch die Fehlermeldung.
BookService
@Transactional public void deleteBook(String id) { if(!bookRepository.existsById(id)) { throw new ApiException("Not found by id: " + id, HttpStatus.NOT_FOUND); } bookRepository.deleteById(id); }
Für den Controller müssen Sie zwei Tests für diese Methode schreiben: einen für die erfolgreiche Löschung und einen weiteren für den Fall, dass ein 404 status
zurückgegeben wird.
Beachten Sie, dass die Servicemethode, die wir mocken, nichts zurückgibt, genau wie der Controller.
Sie können die doNothing()
Methode verwenden, um eine void
Methode zu stubben, sodass keine Aktionen bei deren Aufruf ausgeführt werden. Die Syntax ist:
Wenn Sie ein Szenario behandeln müssen, in dem eine Ausnahme ausgelöst wird, verwenden Sie doThrow()
. Diese Methode in Mockito
simuliert das Auslösen einer Ausnahme von einer void
Methode. Die Syntax ist:
Service-Tests
deleteBook(String id)
Die deleteBook(String id)
Methode erfordert eine Validierung, um sicherzustellen, dass die Buchlöschmethode mit der korrekten id
aufgerufen wird. Zusätzlich ist es wichtig zu testen, wie die Methode mit der Situation umgeht, wenn ein Buch mit der angegebenen id
nicht gefunden wird.
Sie müssen zwei Tests implementieren: einen, bei dem die Entität durch id
gefunden und gelöscht wird, und einen anderen, bei dem eine Ausnahme ausgelöst wird.
Was, wenn Sie keine Tests schreiben können?
Es ist völlig in Ordnung, wenn Sie das Thema beim ersten Versuch nicht verstanden haben; möglicherweise müssen Sie die Testkonzepte erneut durchlesen. Ich empfehle auch, die Lösung zu dieser Aufgabe zu überprüfen.
Danke für Ihr Feedback!