In diesem Zusammenhang wird das Wort "Stub" anstelle von "Mock" verwendet. Aus Gründen der Klarheit und Präzision sollte der Autor jedoch "Mock" verwenden, da "Mock" eine Art Stub ist, jedoch nur zum Testen. Um weitere Verwirrung zu vermeiden, müssen wir definieren, was ein Stub ist.
Im allgemeinen Kontext ist ein Stub ein Programmteil (normalerweise eine Funktion oder ein Objekt), das die Komplexität des Aufrufs eines anderen Programms (normalerweise auf einem anderen Computer, einer anderen VM oder einem anderen Prozess) zusammenfasst - aber nicht immer kann es auch ein lokales sein Objekt). Da sich das tatsächlich aufzurufende Programm normalerweise nicht auf demselben Speicherplatz befindet, erfordert das Aufrufen viele Vorgänge wie Adressieren, Ausführen des eigentlichen Remote-Aufrufs, Marshalling / Serialisieren der zu übergebenden Daten / Argumente (und dasselbe mit dem potenziellen Ergebnis). Vielleicht sogar mit Authentifizierung / Sicherheit und so weiter. Beachten Sie, dass Stubs in einigen Kontexten auch als Proxys bezeichnet werden (z. B. dynamische Proxys in Java).
Ein Mock ist eine sehr spezifische und restriktive Art von Stub, da ein Mock ein Ersatz für eine andere Funktion oder ein anderes Objekt zum Testen ist. In der Praxis verwenden wir häufig Mocks als lokale Programme (Funktionen oder Objekte), um ein Remote-Programm in der Testumgebung zu ersetzen. In jedem Fall kann der Mock das tatsächliche Verhalten des ersetzten Programms in einem eingeschränkten Kontext simulieren.
Die bekanntesten Arten von Stubs sind offensichtlich für die verteilte Programmierung vorgesehen, wenn Remoteprozeduren ( RPC ) oder Remoteobjekte ( RMI , CORBA ) aufgerufen werden müssen . Die meisten verteilten Programmierframeworks / -bibliotheken automatisieren die Generierung von Stubs, sodass Sie sie nicht manuell schreiben müssen. Stubs können aus einer Schnittstellendefinition generiert werden, die beispielsweise mit IDL geschrieben wurde (Sie können jedoch auch eine beliebige Sprache zum Definieren von Schnittstellen verwenden).
Typischerweise unterscheidet man in RPC, RMI, CORBA usw. clientseitige Stubs , die sich hauptsächlich um das Marshalling / Serialisieren der Argumente und das Ausführen des Remote - Aufrufs kümmern , und serverseitige Stubs , die sich hauptsächlich um das Unmarshaling / Deserialisieren kümmern die Argumente und führen tatsächlich die Remote-Funktion / Methode aus. Offensichtlich befinden sich Client-Stubs auf der Client-Seite, während sich mehrere Stubs (häufig als Skelette bezeichnet) auf der Server-Seite befinden.
Das Schreiben guter, effizienter und allgemeiner Stubs wird beim Umgang mit Objektreferenzen zu einer großen Herausforderung. Die meisten Frameworks für verteilte Objekte wie RMI und CORBA befassen sich mit Verweisen auf verteilte Objekte, aber das vermeiden die meisten Programmierer beispielsweise in REST-Umgebungen. In REST-Umgebungen führen JavaScript-Programmierer normalerweise einfache Stub-Funktionen aus, um die AJAX-Aufrufe zu kapseln (Objektserialisierung wird von JSON.parse
und unterstützt JSON.stringify
). Das Swagger Codegen- Projekt bietet umfassende Unterstützung für die automatische Generierung von REST-Stubs in verschiedenen Sprachen.