2013-03-18 6 views
7

Die meisten spöttischen Frameworks sind nur in der Lage, Interfaces zu verspotten, einige können virtuelle Methoden von Klassen verspotten. Einige Java-Mocking-Frameworks sind sogar in der Lage, statische Klassen zu verspotten.Wie funktioniert ein Spott-Framework?

z. Rhino Mock:

var mock = MockRepository.GenerateMock<..>(); 

Was "Magie" geht in der Generate Mock-Methode? Gibt es einen Grund, warum C# -Spionage-Frameworks statische Klassen nicht spotten? Oder ist das nur eine Design-Wahl?

+0

PS: googeln das Thema gibt mir nur Tutorials, wie man ein spöttisches Framework verwendet, nicht was ich suche – bas

+0

probiere "ooo sieh mich an * winkende Hände in der Luft * Ich bin ein Framework ... ooo so besonders ":) – Eonasdan

+2

[moq] (https://code.google.com/p/moq/) ist Open Source. –

Antwort

4

Es ist wirklich sehr lustig und faszinierend, in den Quellcode solcher Frameworks zu schauen und die Antwort selbst zu finden. Rhino Mocks ist Open-Source, sowie Moq und many others. Ich würde auf jeden Fall empfehlen, in eines davon einzutauchen.

Wie für die interne Implementierung (von here):

Jedoch kann der Rahmen nicht nicht-virtuelle Methoden verspotten, so würden wir müssen TouchIron Methode virtuellen machen. Der Grund dafür liegt tief im Inneren: Rhino Mocks verwendet Castle Dynamic Proxy, um die Proxies zu übernehmen, die es zum Mocking benötigt, und Dynamic Proxy kann Aufrufe nicht-virtueller, nicht-abstrakter Methoden nicht abfangen.

+0

Das erklärt wahrscheinlich, warum statische Klassen nicht unterstützt werden, da es keine Möglichkeit gibt, die statischen Methodenaufrufe umzuleiten/zu übernehmen. Ein völlig anderer Ansatz wäre wahrscheinlich erforderlich. – AaronLS

+0

yo thx viel, lesen durch stuff atm und versuchen, die Schaltfläche "Download-Quelle" auf Moq :) zu finden. thx so weit, werde später wiederkommen – bas

4

Die meisten Open-Source-Mocking-Frameworks verwenden Castle Windsor's Dynamic Proxy, um automatisch zur Laufzeit einen Typ zu generieren, der mit dem erwarteten Verhalten programmiert werden kann. Aus diesem Grund benötigen die meisten dieser Frameworks eine Schnittstelle oder eine abstrakte Klasse - sie können nichts vormachen, was keine virtuelle Methode ist.

Es gibt andere (kommerzielle) Mock-Frameworks, die tatsächlich statische und reguläre (versiegelte) Klassen vortäuschen können, einschließlich CLR-Typen, die auf dem nicht verwalteten CLR Profiler API basieren. Grundsätzlich fungiert das Mocking-Framework als Profiler und kann die MSIL-Anweisungen kurz vor der JIT-Kompilierung im Speicher ändern. Auf diese Weise kann der Körper einer Methode durch vordefinierte Werte ersetzt werden. Einige dieser Frameworks sind kostenlos * (Microsoft Fakes, Teil von Visual Studio 2012 Ultimate), andere sind bezahlte Produkte wie Typemock.

Verwandte Themen