Wie Java mocking frameworks arbeiten?
Dies ist NICHT eine Frage, über welches ist das beste framework, etc.
Habe ich noch nie verwendet, ein mocking-framework, und ich bin ein wenig verwirrt von der Idee. Woher weiß er, wie die mock-Objekt? Ist es getan, zur Laufzeit oder ist es eine Datei generieren? Wie Sie wissen, sein Verhalten? Und vor allem – was ist der Ablauf mit einem solchen Rahmen (was ist die Schritt-für-Schritt zum erstellen eines test -)?
Kann das jemand erklären? Sie können wählen, welchen Rahmen Sie wie zum Beispiel einfach sagen, was es ist.
- Sie wollte nicht "das beste framework" Antworten, aber das ist, was du erhalten wirst...
- Siehe auch stackoverflow.com/questions/2277039/how-do-mock-frameworks-work, auch wenn die Antworten dort sind sehr technisch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Rede von den Rahmenbedingungen, die ich benutze ( jmock ), aber andere tun etwas sehr ähnliches.
Es nicht, Sie sagen, der Rahmen, benötigen Sie ein mock-Objekt und geben Sie es einem geben ( idealerweise eine Schnittstelle ) des Objekts, das Sie möchten, zu verspotten. Hinter den kulissen werden die mock-framework verwendet eine Kombination von Reflexion und manchmal auch byte-code schreibt, um erstellen Sie ein mock-Objekt.
jMock erzeugt es zur Laufzeit.
Mock-Objekte sind ziemlich dumm. Sie legen das Verhalten, die Sie von Ihnen erwarten.
Eine sehr wichtige Sache, die Rahmenbedingungen bereitstellen müssen, ist eine Möglichkeit, um zu überprüfen, dass das erwartete Verhalten beobachtet wurde während der Testausführung.
jmock hat es durch die Einführung von spezifischen test-runner, der prüft, dass alle Erwartungen auf allen erklärte mock-Objekte, nachdem der test beendet wurde. Wenn etwas nicht übereinstimmt, wird die exception geworfen wird.
In der Regel das Muster ist:
assertXXX
Methoden.Einem mocking-framework nimmt die Redundanz und Vorlagen von ein mocking-test.
Er weiß, zum erstellen der Mock-Objekt, weil Sie es sagen, natürlich (es sei denn du meintest etwas anderes mit dieser Frage).
Den "standard" Weg der Erstellung eines mock-Objekts ist die Verwendung/Missbrauch der java.lang.reflektieren.Proxy-Klasse zur Erstellung einer runtime-Implementierung von der Schnittstelle. Dies geschieht zur Laufzeit. Proxy hat eine Einschränkung darin, dass es nicht proxy konkreten Klassen. Zu erreichen Spott von konkreten Klassen erfordert dynamische bytecode-Erstellung, erstellt Unterklassen, überschreiben die tatsächliche Implementierung der öffentlichen Methoden mit im wesentlichen dem, was getan werden würde mit einem Proxy (Datensatz die Parameter der Methode und geben einen vorab festgelegten Wert). Dies hat eine Einschränkung darin, dass es nicht Unterklasse Finale Klassen. Dafür haben Sie Lösungen, wie JDave, die (ich glaube, ich nicht bestätigen) muck mit dem classloader zu entfernen, die endgültige Bezeichnung für die Klasse, bevor Sie geladen werden, so dass die Klasse nicht in der Tat endgültig zur Laufzeit so weit wie die JVM betroffen ist.
Das Mocking framework ist im Grunde alles über die Erfassung der Parameter und überprüfen Sie Sie gegen VORGEGEBENE Erwartungen, und dann wieder eine pre-konfiguriert oder vernünftigen default-Wert. Es verhält sich nicht in einer bestimmten Weise, das ist der Punkt. Der aufrufende code wird verifiziert, dass es ruft die Methode mit den richtigen Parametern, und vielleicht, wie es reagiert auf eine bestimmte Rückgabewerte oder Ausnahmen ausgelöst. Irgendwelche Nebenwirkungen oder echte Errungenschaften der Anruf auf das Reale Objekt nicht passieren.
Hier ist ein echtes Beispiel von einem Projekt, mit JMock mit JUnit4. Ich habe Kommentare Hinzugefügt, um zu erklären, was Los ist.
Wenn das mock übergeben wurde ignoriert, der test wäre gescheitert. Wenn die Karte nicht zurückgeben, der Wert, die in Sie schlägt der test fehl (das ist standard JUnit).
Was wird hier getestet und in einem anderen test gegenüber ist, dass je nachdem, was der IPermissionsLookup-Schnittstelle) sagt über die Sicherheit der Karte ändert sich Ihr Verhalten über das, was zurückgegeben wird. Dies ist die Basis guter Fall. Die anderen test, die mock-gibt false zurück, und etwas anderes ist zu erwarten von der Karte. Mit dem mock stellt sicher, dass die Karte stützt sich auf die IPermissionsLookup Methode, um zu bestimmen, die Sicherheitslage und das, was zurückgegeben wird.
Für ein besseres Verständnis der Spott, möchten Sie vielleicht, um Ihr eigenes mock-Objekt. Es ist ein ziemlich einfacher Prozess - Sie machen eine Klasse implementieren die gleiche Schnittstelle wie das, was Sie sind lustig, und geben Sie das Verhalten, die Sie benötigen, entweder die Aufnahme Aufrufe einer Methode oder die Reaktion in einem Satz Weg, wenn Sie aufgerufen. Von dort den Weg, dass mocking-frameworks eingestellt sind, beginnt mehr Sinn machen.
Ich denke, dass EasyMock Dokumentation ist ein Weg, um Ihnen den Einstieg. Es verfügt über eine Menge von Beispielen, die sind leicht zu begreifen.
EasyMock (http://easymock.org/) ist der mocking-library, die ich verwendet haben die meisten. (Es gibt auch andere: jMock, Mockito, etc.)
Meisten dieser erstellen Sie ein Objekt zur Laufzeit, die Sie Steuern können. Der grundlegende Ablauf ist: