Meine Klassen folgen dieser Struktur
- Service Tier (erstellt und ordnet InputDTO DB-Daten zu)
- DAO Tier (führt tatsächlich DB-Aufrufe aus)
Wenn ich JUnit-Tests der Service-Schicht schreibe, wird die DAO-Schicht aufgerufen. Dies erwartet eine tatsächliche DB-Verbindung und das Abrufen von Daten aus der DB.
Sollte ich die DAO-Schicht vollständig von der Service-Schicht verspotten oder sollte ich die DB-Verbindung und die von der DB empfangenen Daten verspotten?
Zweitens erwartet die App bestimmte Daten aus einem Cache.
Für die JUnit-Laufzeit gibt es keinen Cache. Wie soll damit umgegangen werden? Die Service-Tier-Methode umfasst das Nachschlagen des Caches, um die Details abzurufen.
quelle
In der Zusammenfassung ist die Antwort recht einfach.
Sie haben drei Schichten.
[Der Testfall] -> [Das zu testende Verhalten] -> [Die von diesem Verhalten verwendeten Mitarbeiter]
Die dritte Schicht sollte verspottet werden. Zum Beispiel:
PokemonCaptureServiceTest
;PokemonCaptureService
;Pokeball
In diesem Beispiel stellt sich heraus, dass es sich um eine
Pokeball
Logik von Drittanbietern handelt. Es erfordert alle Arten von Installationen wie Datenbankverbindungen und Eigenschaftendateien usw. Sie vertrauen darauf, dass Ihr Dritter es ordnungsgemäß getestet hat, und möchten es daher bei Ihren Tests von weglassenPokemonCaptureService
. Daher sollte es verspottet werden.Zu einem anderen Zeitpunkt und an einem anderen Ort ist der Mitarbeiter
Pokeball
jedoch eine einfache Klasse, die nur sehr wenig Komplexität in den Testfall einführt und problemlos in den Test aufgenommen werden kann. In diesem Fall können Sie entscheiden, eine reale Instanz vonPokeball
in diePokemonCaptureService
zu testende Instanz aufzunehmen.Es gibt keine feste Regel. Es liegt an Ihnen, Ihre Tests so zu gestalten, wie es Ihnen am besten erscheint. Ihr Ziel ist es, so schnell wie möglich korrekte und wartbare Tests zu erstellen. Erfahrung ist hier der Schlüssel. Schreiben Sie weitere Tests und Sie werden sehr bald eine gute Intuition dafür bekommen.
quelle
Es ist schwer zu sagen, was genau Sie testen möchten, denn nach der Frage zu urteilen, sind Sie überall. Daher ist es schwierig, Ihnen ein praktisches Beispiel für das weitere Vorgehen zu geben, als Sie zu Artikeln über das Verspotten von Dingen zu führen. Sie müssen also genauer sein und die Dinge ein wenig aufteilen:
Möchten Sie testen, ob der Cache ordnungsgemäß funktioniert?
Möchten Sie insbesondere einen DB-Aufruf testen?
Möchten Sie die App testen, damit sie den Cache korrekt verwendet?
Sobald Sie genau entschieden haben, welche Einheit Sie testen möchten, wird die Auswahl der zu verspottenden Einheit einfach: Bei einem reinen Einheitentest sollte alles außer der "zu testenden Einheit" verspottet werden. Der Grund dafür ist, dass Sie anhand Ihrer Erwartungen an die Verspottungen sicher sein können, dass das getestete Gerät ordnungsgemäß funktioniert.
Abgesehen davon möchten Sie möglicherweise einige Tests in JUnit schreiben, die Integrationstests sind, dh weniger Mocks verwenden. Selbst wenn sie als Sanity Checks verwendet werden, um festzustellen, ob das Software-Design korrekt ist, sollten Sie sich darüber im Klaren sein, dass sie spröde sind und nicht immer einen Hinweis darauf geben, was genau mit Ihrer App oder Ihrem System nicht stimmt.
quelle