In Verspottungs-Frameworks können Sie ein Objekt verspotten oder es ausspionieren . Was ist der Unterschied zwischen den beiden und wann würde / sollte ich einen über den anderen verwenden?
Wenn ich zum Beispiel Mockito betrachte , sehe ich, dass ähnliche Dinge mit Spionen und Spott gemacht werden , aber ich bin mir nicht sicher, ob zwischen beiden unterschieden wird.
unit-testing
mocking
tdd
Vivin Paliath
quelle
quelle
Antworten:
Das Scheinobjekt ersetzt die verspottete Klasse vollständig und gibt aufgezeichnete oder Standardwerte zurück. Sie können Mock aus "dünner Luft" erstellen. Dies wird hauptsächlich beim Testen von Einheiten verwendet.
Beim Spionieren nehmen Sie ein vorhandenes Objekt und "ersetzen" nur einige Methoden. Dies ist nützlich, wenn Sie eine große Klasse haben und nur bestimmte Methoden verspotten möchten (teilweise Verspottung). Lassen Sie mich die Mockito-Dokumentation zitieren :
Verwenden Sie im Zweifelsfall Mocks.
quelle
Mockito warnt davor, dass teilweises Verspotten keine gute Praxis ist, und Sie sollten Ihre objektorientierte Architektur überarbeiten. Spion (oder teilweise Verspottung) wird empfohlen, um Legacy-Code zu testen .
quelle
Ich werde versuchen, dies anhand eines Beispiels zu erklären:
Hier hatten wir ein anfängliches reales Objekt
list
, in dem wir ein Element hinzugefügt haben und erwartet haben, dass die Größe eins ist.Wir spionieren reale Objekte aus, was bedeutet, dass wir anweisen können, welche Methode gestoppt werden soll . Also haben wir erklärt, dass wir die Methode gestoppt haben -
size()
für ein Spionageobjekt, das 10 zurückgibt , unabhängig von der tatsächlichen Größe.Auf den Punkt gebracht, werden Sie auszuspionieren realen Objekt und Stummel einige der Methoden .
quelle
Referenz: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/
Wenn Sie Scheinobjekte verwenden, ist das Standardverhalten der Methode, wenn sie nicht stub ist, nichts zu tun. Einfach bedeutet, wenn es eine void-Methode ist, wird es nichts tun, wenn Sie die Methode aufrufen, oder wenn es eine Methode mit einer Rückgabe ist, kann es null, leer oder den Standardwert zurückgeben.
Da es sich bei Spionageobjekten natürlich um eine echte Methode handelt, wird das echte Methodenverhalten aufgerufen, wenn Sie die Methode nicht stubben. Wenn Sie die Methode ändern und verspotten möchten, müssen Sie sie stubben.
quelle
Mocks Aren't Stubs von Martin Fowler
quelle
Spione haben zwei Definitionen. Zum einen wird die reale Methode aufgerufen, zum anderen wird keine Funktionalität aufgerufen und es werden nur null oder null äquivalente Werte zurückgegeben, aber Methoden wurden aufgerufen, und ihr Status wurde aufgezeichnet, wie die Methode x y-mal aufgerufen wurde.
quelle
Wenn Sie in Mockito der Instanzvariablen von Mock Object ein Objekt zuweisen, wirkt sich dies nicht auf Mock Object aus.
Wenn Sie jedoch im Fall von Spy ein Objekt der Instanzvariablen von Spy Object zuweisen, wirkt sich dies auf Spy Object aus, da Spy sich wie eine Echtzeit-Objektänderung verhält.
Als Referenzbeispiel dienen
quelle