Frage

Ich bin ein .NET -Typ - und ich codiere hauptsächlich in C#.

Seit C# 3.0 können wir Lambda -Ausdrücke und Ausdrucksbäume nutzen, um sie zu verwenden statische Reflexion. Zum Beispiel ist es möglich zu implementieren GetMethodName im folgenden Snippet, um den Namen der in Parameter übergebenen Methode zurückzugeben:

string methodName = GetMethodName( o => o.DoSomething());
Console.WriteLine(methodName); // displays "DoSomething"

Wenn ich mir Mockito -Proben (oder Easymock) in der Java -Welt ansehe, sehe ich:

LinkedList mockedList = mock(LinkedList.class);
when(mockedList.get(0)).thenReturn("first");

Wie funktioniert es?

Wie macht das when Methodenarbeit? Wie interpretiert es mockedList.get(0) wie Ein Aufruf zur GET -Methode mit 0 als Parameter bestanden Und nicht als Wert?

War es hilfreich?

Lösung

Verspottete Bibliotheken arbeiten normalerweise nicht mit Ausdrucksbäumen. Sie erstellen einen Typ, der die entsprechende Schnittstelle implementiert und auf Methodenaufrufe reagiert, indem sie diese aufzeichnen oder validieren und die vorprogrammierten Antworten zurückgeben. Dies geschieht normalerweise entweder mit einem Proxy (z. B. Realproxy in .net, Proxy in Java) oder mit dynamischer Codegenerierung.

Im Fall von EasyMock verwendet es Proxy (Wie auch immer für Schnittstellen), wie Sie im Quellcode sehen können: Schauen Sie sich an org.easymock.internal.JavaProxyFactory.

Andere Tipps

Java Mock -Bibliotheken funktionieren normalerweise wie folgt:

Wenn Sie ein Mock erstellen, wird ein tatsächlicher Proxy erstellt (sei es von einer Schnittstelle oder einer Unterklasse), die Instanz befindet sich im "Aufzeichnungsmodus". Dies bedeutet, dass ein nachfolgender Anruf aufgezeichnet wird (Methodenname, Parameter, Rückgabe erwartet). Beachten Sie, dass der Proxy im Aufzeichnungsmodus tatsächlich nichts anderes tut, als die Anrufe aufzuzeichnen. Es gibt keine Reflexion pro Sees. Keine Metadaten-Entdeckung usw. Natürlich machen diese Bibliotheken einige Tricks (z. B. das Speichern von Invocations in einer Thread-lokalen Variablen, um Methoden zu verarbeiten, die Leerlauf zurückgeben), aber die Idee bleibt gleich.

Wenn dann der "Wiederholungsmodus" gestartet wird, überprüft die Mock -Instanz einfach die Erwartungen aus der Liste der Aufrufe (Methode+Parameter und Rückgabewerte).

Ich habe noch nie mit Mockito oder Easymock gearbeitet, aber ich glaube nicht, dass der Anruf das tut, was Sie denken. Es interpretiert nicht mockedList.get(0) In irgendeiner besonderen Weise. Die Methode get wird auf dem ausgeführt mockedList Objekt normal und die Ergebnis davon wird übergeben when.

mockedList.get(0) ist die Syntax für einen Methodenaufruf und tut genau das. Was diese Methode tut, ist nicht gerade klar. mockedListDie Laufzeittyp wird eine Unterklasse von sein LinkedList zurückgegeben von der mock Methode, die implementiert werden kann, wie immer das spöttische Framework für passen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top