it-swarm.com.de

Verspotten oder Ausspähen im Rahmen von Verspottungen

In spottenden Frameworks können Sie ein Objekt verspotten oder ausspionieren. Was ist der Unterschied zwischen den beiden und wann würde/sollte ich eins übereinander verwenden? Wenn ich mir zum Beispiel Mockito anschaue, sehe ich, dass ähnliche Dinge mit Spionen und Spott gemacht werden, aber ich bin mir nicht sicher, was die Unterscheidung zwischen den beiden betrifft.

112
Vivin Paliath

Verspottetes Objekt 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 Ausspähen 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 (partielles Verspotten). Lassen Sie mich Mockito Dokumentation zitieren :

Sie können Spione von realen Objekten erstellen. Wenn Sie den Spion verwenden, werden die echten Methoden aufgerufen (es sei denn, eine Methode wurde gestubbt).

Echte Spione sollten sorgfältig und gelegentlich eingesetzt werden , zum Beispiel beim Umgang mit altem Code.

Verwenden Sie im Zweifelsfall Mocks.

130

Mockito warnt davor, dass teilweises Verspotten keine gute Praxis ist und Sie sollten Ihre OO Architektur überarbeiten. Spion (oder teilweise Verspottung) wird empfohlen, um Legacy-Code zu testen.

10
Suelmar Zanetti

Kann versuchen, anhand eines Beispiels hier zu erklären.

// difference between mocking, stubbing and spying
@Test
public void differenceBetweenMockingSpyingAndStubbing(){
    List list = new ArrayList();
    list.add("abc");
    assertEquals(1,list.size());
    List mockedList = spy(list);
    when(mockedList.size()).thenReturn(10);
    assertEquals(10,mockedList.size());
}

Hier hatten wir eine anfängliche Liste realer Objekte, in der wir ein Element hinzugefügt haben und die erwartete Größe eins war.

wir spähen echte Objekte aus, was bedeutet, dass wir anweisen können, welche Methode gestoppt werden soll. Also haben wir erklärt, dass wir method - size () auf ein Spionageobjekt angewendet haben, das 10 zurückgibt, unabhängig von der tatsächlichen Größe.

kurz gesagt, Sie werden echte Objekte ausspähen und einige der Methoden stummschalten.

10
user2775185

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äquivalentwerte zurückgegeben, aber Methoden wurden aufgerufen, und ihr Status wurde aufgezeichnet, üblicherweise wie Methode x wurde y-mal aufgerufen.

1
John Heilman

Referenz: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/

Bei der Verwendung von Scheinobjekten ist das Standardverhalten der Methode, wenn kein Stub vorliegt, nichts. Einfach bedeutet, wenn es sich um eine void-Methode handelt, wird beim Aufrufen der Methode nichts unternommen. Wenn es sich um eine Methode mit einem return handelt, wird möglicherweise null, leer oder der Standardwert zurückgegeben.

Da es sich bei Spionageobjekten natürlich um eine echte Methode handelt, wird das Verhalten der echten Methode aufgerufen, wenn Sie die Methode nicht unterbrechen. Wenn Sie die Methode ändern und verspotten möchten, müssen Sie sie stummschalten.

1
Jerry C.