Wie man mit statischen Methoden spottet?
Ich bin neu in der mock-Objekte, aber ich verstehe, dass ich muss meine Klassen implementieren Schnittstellen, um um Sie zu verhöhnen.
Das problem das ich habe ist, dass in meinem data access layer, den will ich haben statische Methoden, aber ich kann nicht eine statische Methode in einem interface.
Was ist der beste Weg, um dieses? Sollte ich nur mit Instanz-Methoden (was falsch ist) oder gibt es eine andere Lösung?
InformationsquelleAutor der Frage brien | 2008-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde eine Methode object pattern. Eine statische Instanz dieser, und rufen Sie die statische Methode. Es sollte möglich sein, die Unterklasse zum testen, je nach mocking framework.
d.h. in Ihrer Klasse mit der statischen Methode haben:
und Ihre Methode-Objekt kann eine sehr einfache, leicht-getestet:
InformationsquelleAutor der Antwort Grundlefleck
Fand ich eine blog über google mit einige gute Beispiele, wie dies zu tun:
Refactor Klasse, die eine Instanz der Klasse und eine Schnittstelle implementieren.
Sie haben bereits erklärt, dass Sie nicht wollen, dies zu tun.
Verwendung einer wrapper-Instanz-Klasse, bei der die Delegierten für statische Klassen-Mitglieder
Diese Weise können Sie simulieren eine statische Schnittstelle, über die Delegierten.
Verwendung einer wrapper-Instanz-Klasse, mit geschützten Mitglieder-Aufruf der statischen Klasse
Dies ist wahrscheinlich die einfachste zu verspotten/verwalten ohne refactoring-wie kann es nur sein, vererbt und erweitert werden.
InformationsquelleAutor der Antwort Rick Minerich
Ja, verwenden Sie die Instanz-Methoden. Statische Methoden, die im Grunde sagen, "Es gibt einen Weg, um diese Funktionalität zu erreichen - es ist nicht polymorph." Spott setzt auf Polymorphismus.
Nun, wenn Sie Ihre statische Methoden, die logisch nicht kümmern, was die Implementierung, die Sie verwenden, werden Sie möglicherweise in der Lage, die Schnittstellen als Parameter, oder vielleicht arbeiten ohne Interaktion mit dem Staat überhaupt - aber ansonsten sollten Sie die Verwendung von Instanzen (und wahrscheinlich dependency injection zu Draht-alles zusammen).
InformationsquelleAutor der Antwort Jon Skeet
Könnten Sie versuchen zu testen, bei zu tiefen Ausgangspunkt. Ein test muss nicht erstellt werden, zu testen, und jede Methode individuell, private und statische Methoden sollten getestet werden, durch den Aufruf der public-Methoden, dann rufen Sie die private und statische wiederum.
Also sagen wir, dass Ihr code wie dieser:
Brauchen Sie nicht zu schreiben, einen test gegen die TransformData Methode (und Sie nicht). Stattdessen schreiben Sie einen test für die Methode GetData, dass die tests auf die Arbeit in TransformData.
InformationsquelleAutor der Antwort Carlton Jenke
Mit Instanz-Methoden wo es möglich ist.
Verwenden public static Func[T, U] (statische Funktion verweist, die ersetzt werden kann für mock-Funktionen), wo die Instanz-Methoden sind nicht möglich.
InformationsquelleAutor der Antwort Amy B
Eine einfache Lösung ist, um zu ermöglichen, ändern Sie die statische Klasse, die Umsetzung über eine setter:
Also in das setup des tests, nennen Sie
overrideImplementation
mit einigen verspottet-Schnittstelle. Der Vorteil ist, dass Sie brauchen nicht zu ändern Kunden Ihre statischen Klasse. Der Nachteil ist, dass Sie wahrscheinlich haben ein wenig duplizierten code, da müssen Sie wiederholen Sie die Methoden der statischen Klasse und es ist die Umsetzung. Aber einige Male die statischen Methoden verwenden können, eine ligther-Schnittstelle, die Basis-Funktionalität.InformationsquelleAutor der Antwort asterite
Das problem, das Sie haben ist, wenn man mit 3rd-party-code und es heißt, aus einer Ihrer Methoden. Was wir am Ende tun ist, wickeln Sie es in ein Objekt, und rufen Sie es mit der Datenausführungsverhinderung inj, und dann Ihr Gerät testen können gespielter 3rd-party-statische Methode Aufruf der setter.
InformationsquelleAutor der Antwort dstarh