oder kann die Klasse auch eine abstrakte Klasse implementieren?Um ein Objekt zu verhöhnen, muss es entweder eine Schnittstelle implementieren oder als virtuell markiert sein?
Antwort
eine Art lustig zu machen, muss es entweder eine Schnittstelle sein oder virtuelle Elemente (abstrakte Elemente auch virtuell) (dies wird auch seine rein virtuelle genannt).
Durch diese Definition können Sie alles, was ist virtuell mockten.
Im Wesentlichen, dynamische Mocks tun Sie nichts, was Sie nicht mit der Hand tun könnten.
Angenommen, Sie programmieren gegen eine Schnittstelle wie diese:
public interface IMyInterface
{
string Foo(string s);
}
Sie manuell eine Testspezifische Implementierung von IMyInterface schaffen könnte, die den Eingangsparameter ignoriert und immer wieder die gleiche Ausgabe:
public class MyClass : IMyInterface
{
public string Foo(string s)
{
return "Bar";
}
}
Aber das wird sich wirklich schnell wiederholen, wenn Sie testen möchten, wie der Verbraucher auf unterschiedliche Rückgabewerte reagiert, also statt Testdoppel per Hand zu codieren, können Sie ha ve ein Framework dynamisch für Sie erstellen.
Stellen Sie sich vor, dass dynamische Mocks wirklich Code ähnlich der MyClass-Implementierung oben schreiben (sie schreiben den Code nicht wirklich, sie geben die Typen dynamisch aus, aber es ist eine genau genug Analogie).
Hier ist, wie Sie das gleiche Verhalten wie MyClass mit Moq definieren könnte:
var mock = new Mock<IMyInterface>();
mock.Setup(x => x.Foo(It.IsAny<string>())).Returns("Bar");
In beiden Fällen ist die construcor der erzeugten Klasse aufgerufen wird, wenn das Objekt erstellt wird. Da eine Schnittstelle keinen Konstruktor hat, ist dies normalerweise der Standardkonstruktor (von MyClass bzw. der dynamisch emittierten Klasse).
Sie das gleiche mit konkreten Typen wie diesem tun:
public class MyBase
{
public virtual string Ploeh()
{
return "Fnaah";
}
}
Mit der Hand, würde Sie in der Lage sein, von MyBase abzuleiten und die Ploeh Methode überschreiben, weil es virtuell ist:
public class TestSpecificChild : MyBase
{
public override string Ploeh()
{
return "Ndøh";
}
}
Eine dynamische Scheinbibliothek kann dasselbe tun, und dasselbe gilt für abstrakte Methoden.
Sie können jedoch keinen Code schreiben, der ein nicht virtuelles oder internes Mitglied außer Kraft setzt, und dynamische Mocks auch nicht. Sie können nur tun, was Sie von Hand tun können.
Vorbehalt: Die obige Beschreibung gilt für die meisten dynamischen Mocks mit Ausnahme von TypeMock, die anders ist und unheimlich ist.
Es gibt auch eine neuere Spottbibliothek, Microsoft Moles, die tut, was TypeMock auch tut ... es verhöhnt alles, einschließlich nicht-virtueller, versiegelter und statischer Methoden. –
Sie können Moq verwenden Mocks von beiden Schnittstellen zu erstellen und vorhandene Klassen. Es gibt einige Anforderungen an die Klassen. Die Klasse kann nicht versiegelt werden. Darüber hinaus muss die zu spottende Methode als virtuell markiert werden. Sie können statische Methoden nicht vortäuschen (verwenden Sie das Adaptermuster, um eine statische Methode nachzuahmen).
- 1. Objekte verspotten - alle Methoden als virtuell deklarieren oder Schnittstelle benutzen?
- 2. Klasse Design: Klasse implementieren eine Schnittstelle implementieren eine andere Schnittstelle
- 3. RNMK - Super Ausdruck muss entweder null sein oder eine Funktion
- 4. Ist es besser, eine * Schnittstelle * oder ein * Objekt * als Parameter an eine Funktion zu übergeben?
- 5. Klasse muss entweder abstrakt erklärt werden oder abstrakte Methode implementieren
- 6. "Super Ausdruck muss entweder Null sein oder eine Funktion, kein Objekt" Fehler
- 7. Muss eine Klasse sich an den dokumentierten Vertrag einer Schnittstelle halten, um diese Schnittstelle zu implementieren
- 8. Klasse muss entweder abstrakte Methode Fehler erklärt abstrakt oder implementieren
- 9. CSLA: Listenelement muss als Kindobjekt markiert werden
- 10. Wie alle Eigenschaften ignoriert werden, die als virtuell markiert sind
- 11. IQuery NHibernate - Muss es eine Liste sein?
- 12. CodeFirstMembership - Entity Mitglieder, die als virtuell markiert sind.
- 13. Membervariable, die Klasse A erweitern und eine Schnittstelle implementieren muss
- 14. Ist es sinnvoll, eine Basisklassenfunktion sowohl als virtuell als auch als final zu kennzeichnen?
- 15. Wenn ich Benutzer zwingen möchte, eine Schnittstelle zu implementieren, um eine private Methode/Eigenschaft zu implementieren, gibt es einen Trick?
- 16. Kann ich Erweiterungsmethoden verwenden, um eine Schnittstelle zu implementieren?
- 17. babelHelpers.js throws Super-Ausdruck muss entweder null sein oder eine Funktion, nicht undefiniert
- 18. PHP - Vererbung Schnittstelle - Erklärung muss kompatibel sein
- 19. Reagieren 0.14.2 Fehler - Super Ausdruck entweder null sein muss oder eine Funktion
- 20. Die linke Seite für einen ALL- oder ANY-Operator muss entweder ein NSArray oder ein NSSet sein.
- 21. Fehler: Ein Pixelrahmen muss entweder transparent oder weiß sein. Android Studio
- 22. ReactNative Upgrade-0.26 „Super-Ausdruck muss entweder null oder eine Funktion sein, nicht null“
- 23. Der Zieltyp dieser Ausdruck muss eine funktionale Schnittstelle sein
- 24. BDD in Scala - Muss es hässlich sein?
- 25. Java "Zieltyp der Lambda-Konvertierung muss eine Schnittstelle sein"
- 26. Objekt als Schnittstelle
- 27. React-Router-Fehler: Super-Ausdruck muss entweder Null oder eine Funktion sein
- 28. Reagieren Native - Super-Ausdruck entweder null oder eine Funktion sein muss, nicht
- 29. WPF - es muss einfacher sein als ich es mache
- 30. Reagieren 15.0.2 ES6/Webpack/Babel Super-Ausdruck muss entweder Null sein oder eine Funktion, nicht undefiniert
Sie haben gerade vor ein paar Tagen im Wesentlichen die gleiche Frage gestellt: http://StackOverflow.com/Questions/1969497/Can-Sie-Maus-an-Objekt-das-Implements-an-Interface-und-an-abstract -Klasse –