Das ist eine gute Frage! Ich denke, die Hauptursache dafür ist die folgende: Wir verwenden JUnit nicht nur für Unit-Tests. Die Frage sollte also aufgeteilt werden:
- Sollte ich Mockito.verify () für meine Integrationstests (oder andere Tests, die höher als die Einheit sind) verwenden?
- Sollte ich Mockito.verify () in meinem Black-Box- Unit-Test verwenden?
- Sollte ich Mockito.verify () in meinem White-Box- Unit-Test verwenden?
Wenn wir also Tests ignorieren, die höher als die Einheit sind, kann die Frage umformuliert werden: "Die Verwendung von White-Box- Unit-Tests mit Mockito.verify () schafft ein gutes Paar zwischen Unit-Test und meiner möglichen Implementierung. Kann ich eine Gray-Box erstellen?" " Unit-Test und welche Faustregeln sollte ich dafür verwenden ".
Lassen Sie uns nun all dies Schritt für Schritt durchgehen.
* - Sollte ich Mockito.verify () in meinen Integrationstests (oder anderen Tests, die höher als die Einheit sind) verwenden? * Ich denke, die Antwort lautet eindeutig nein. Außerdem sollten Sie hierfür keine Mocks verwenden. Ihr Test sollte so nah wie möglich an der tatsächlichen Anwendung sein. Sie testen den vollständigen Anwendungsfall, nicht den isolierten Teil der Anwendung.
* Black-Box vs White-Box - unit-testing * Wenn Sie mit Black-Box - Ansatz , was Sie wirklich tun , ist, liefern Sie (alle Äquivalenzklassen) eingegeben wird , ein Zustand , und Tests , dass Sie erwartete Ausgabe erhalten. Bei diesem Ansatz ist die Verwendung von Mocks im Allgemeinen gerechtfertigt (Sie ahmen nur nach, dass sie das Richtige tun; Sie möchten sie nicht testen), aber das Aufrufen von Mockito.verify () ist überflüssig.
Wenn Sie einen White-Box- Ansatz verwenden, testen Sie das Verhalten Ihres Geräts. Bei diesem Ansatz ist der Aufruf von Mockito.verify () unerlässlich. Sie sollten sicherstellen, dass sich Ihr Gerät so verhält, wie Sie es erwarten.
Daumenregeln für Gray-Box-Tests
Das Problem beim White-Box-Test besteht darin, dass eine hohe Kopplung entsteht. Eine mögliche Lösung besteht darin, Gray-Box-Tests durchzuführen, keine White-Box-Tests. Dies ist eine Kombination aus Black & White Box-Tests. Sie testen das Verhalten Ihres Geräts wirklich wie beim White-Box-Testen, aber im Allgemeinen machen Sie es nach Möglichkeit implementierungsunabhängig . Wenn es möglich ist, machen Sie einfach eine Prüfung wie im Black-Box-Fall und behaupten nur, dass die Ausgabe Ihren Erwartungen entspricht. Das Wesentliche Ihrer Frage ist also, wann es möglich ist.
Das ist wirklich schwer. Ich habe kein gutes Beispiel, aber ich kann Ihnen Beispiele geben. In dem oben erwähnten Fall mit equals () vs equalsIgnoreCase () sollten Sie Mockito.verify () nicht aufrufen, sondern nur die Ausgabe bestätigen. Wenn Sie dies nicht tun konnten, teilen Sie Ihren Code auf die kleinere Einheit auf, bis Sie es tun können. Nehmen wir andererseits an, Sie haben einen @ Service und schreiben einen @ Web-Service, der im Wesentlichen ein Wrapper für Ihren @ Service ist. Er delegiert alle Aufrufe an den @ Service (und führt eine zusätzliche Fehlerbehandlung durch). In diesem Fall ist es wichtig, dass Sie Mockito.verify () aufrufen. Sie sollten nicht alle Überprüfungen duplizieren, die Sie für @Serive durchgeführt haben. Überprüfen Sie, ob Sie @Service mit der richtigen Parameterliste aufrufen.