Warum ist es so schlecht, Unterricht zu verspotten?
Ich vor kurzem eine Diskussion mit einem Kollegen zu verspotten. Er sagte, dass mocking-Klassen ist sehr schlecht und sollte nicht getan werden, nur in wenigen Fällen.
Er sagt, dass nur die interfaces werden sollte, verspottet, ansonsten ist es eine Architektur zu Verschulden.
Frage ich mich, warum diese Aussage (die ich ihm voll und ganz vertraut) ist das so richtig? Ich weiß es nicht und möchte überzeugt werden.
Habe ich den Punkt verpassen, der Spott (ja, ich lese Martin Fowlers Artikel)
InformationsquelleAutor der Frage guerda | 2009-10-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Spott ist für Protokoll testen - es wird getestet, wie Sie verwenden eine API, und wie Sie darauf reagieren werden, wenn die API entsprechend reagiert.
Ideal (in vielen Fällen zumindest), dass API sollte angegeben werden, als Schnittstelle und nicht als eine Klasse eine Schnittstelle definiert ein Protokoll, eine Klasse definiert zumindest teilweise eine Umsetzung.
Auf eine praktische note, mocking frameworks neigen dazu, Grenzen zu haben um Spott Klassen.
Meiner Erfahrung, Spott ist etwas überlastet - oft sind Sie nicht wirklich daran interessiert, die genaue Interaktion, die Sie wirklich wollen, eine stub... aber mocking-framework kann verwendet werden, zum erstellen von stubs, und Sie fallen in die Falle der Schaffung spröde tests durch Spott statt der Lunte. Es ist eine schwierige balance zu bekommen, stimmt allerdings.
InformationsquelleAutor der Antwort Jon Skeet
IMHO, was dein Kollege meint ist, dass Sie sollten Programm auf eine Schnittstelle, nicht die Implementierung. Wenn Sie finden, sich selbst verspottend-Klassen zu oft, es ist ein Zeichen, das Sie brach das bisherige Prinzip beim entwerfen von Architektur.
InformationsquelleAutor der Antwort Pascal Thivent
Mocking von Klassen (im Gegensatz zu Spott-Schnittstellen) ist schlecht, weil die mock hat noch eine real-Klasse in den hintergrund, es ist ererbt, und es ist möglich, dass realen Umsetzung ist ausgeführt während der Prüfung.
Wenn Sie mock (oder stub oder was auch immer) eine Schnittstelle, es gibt keine Gefahr, dass code ausgeführt, Sie wollte eigentlich zu verspotten.
Spott Klassen auch zwingt Sie, um alles, das könnte eventuell verspottet zu werden virtuellendie ist sehr aufdringlich und könnte dazu führen, bad-class-design.
Wenn Sie möchten, dass zur Entkopplung von Klassen, sollten Sie nicht wissen, jeder andere, dies ist auch der Grund, warum es Sinn macht, zu verspotten (oder stub oder was auch immer) einer von Ihnen. Also die Implementierung gegen interfaces ist sowieso empfohlen, aber dies ist hier erwähnt, von anderen genug.
InformationsquelleAutor der Antwort Stefan Steinegger
In der Regel würden Sie wollen, zu verhöhnen, eine Schnittstelle.
Während es möglich ist, zu verspotten eine reguläre Klasse, es neigt dazu, Einfluss auf Ihre Klasse design zu viel für Testbarkeit. Bedenken wie Zugänglichkeit, ob oder nicht eine Methode virtuell ist, etc.. alle werden bestimmt, indem die Fähigkeit zum simulieren der Klassesondern als echte OO Bedenken.
Es ist eine faking-Bibliothek namens TypeMock Isolator, der Ihnen erlaubt, um diese Einschränkungen zu umgehen (haben Kuchen, Kuchen Essen), aber es ist ziemlich teuer. Besser design für Testbarkeit.
InformationsquelleAutor der Antwort Anderson Imes
Ich würde vorschlagen, bleiben Weg von mocking-frameworks so weit wie möglich. Zur gleichen Zeit, ich würde empfehlen die Verwendung von mock/fake-Objekte für das testen, so viel wie möglich. Der trick hier ist, die Sie erstellen sollten eingebaute gefälschte Objekte zusammen mit realen Objekten. Ich erkläre es Ausführlicher in einem blog-post schrieb ich darüber: http://www.yegor256.com/2014/09/23/built-in-fake-objects.html
InformationsquelleAutor der Antwort yegor256
Edit: Da hast du klargestellt, dass Ihr Kollege meinte mock Klasse ist schlecht, aber mock Schnittstelle nicht, die Antwort unten ist veraltet. Sie sollten sich auf diese Antwort.
Ich spreche von mock und stub als definiert von Martin Fowlerund ich gehe davon aus, dass das, was Ihr Kollege gemeint, zu.
Spott ist schlecht, weil es kann dazu führen, overspecification von tests. Verwenden stub, wenn möglich und vermeiden Sie zu verspotten.
Hier ist der Unterschied zwischen mock und stub (aus dem obigen Artikel):
InformationsquelleAutor der Antwort Graviton
Die Antwort, wie die meisten Fragen über die Praxis, ist "es hängt".
Übermäßige Einsatz von mocks kann führen zu tests, die nicht wirklich testen, nichts. Es kann auch dazu führen, dass tests, die virtuelle re-Implementierungen der code unter test, eng gebunden an eine spezifische Implementierung.
Auf der anderen Seite, einem gezielten Einsatz von mocks und stubs können dazu führen unit-tests, die sind ordentlich isoliert und testen Sie eine Sache und eine Sache allein - das ist eine gute Sache.
Es ist alles über Maßen.
InformationsquelleAutor der Antwort Avdi
Macht es Sinn, mock-Klassen an, so dass tests geschrieben werden können, bereits frühzeitig im Entwicklungszyklus.
Gibt es eine Tendenz zu weiterhin verwenden, mock-Klassen, auch wenn die konkreten Implementierungen verfügbar werden. Es gibt auch die Tendenz, sich zu entwickeln, gegen die mock-Klassen (und stubs) notwendig, frühzeitig in ein Projekt, wenn einige Teile der Anlage noch nicht gebaut worden.
Einmal ein Stück, das system wurde gebaut, es ist notwendig, um es getestet und weiter zu testen, gegen die es (für regression). In diesem Fall beginnend mit mocks ist gut, aber Sie sollte verworfen werden, zugunsten der Umsetzung so bald wie möglich. Ich habe gesehen, Projekte kämpfen, weil die anderen teams entwickeln sich weiter gegen das Verhalten der mock-eher als die Umsetzung (sobald es verfügbar ist).
Durch die Prüfung gegen spottet, Sie sind unter der Annahme, dass die mock ist charakteristisch für das system. Dazu gehört oft raten, was die verspottet Komponente zu tun. Wenn Sie eine Spezifikation des Systems, das Sie verspotten, dann Sie haben nicht zu erraten, aber oft die 'as-built' - system entspricht nicht der ursprünglichen Spezifikation aus praktischen Erwägungen entdeckt während der Bauphase. Agile Entwicklung von Projekten angenommen, dies wird immer passieren.
Sie entwickeln dann code, der funktioniert mit der Attrappe. Wenn es sich herausstellt, dass die Modelle nicht wirklich repräsentieren das Verhalten der real-as-built-system (zB. Latenz Probleme nicht gesehen, in den mock -, Ressourcen-und Energieeffizienz Probleme nicht gesehen, in den mock -, concurrency-Probleme, performance-Probleme, etc) haben Sie dann einen Haufen wertlosen Spott tests müssen Sie jetzt pflegen.
Halte ich die Verwendung von mocks als wertvoll am Anfang der Entwicklung, aber diese Parodie sollte nicht dazu beitragen, Projekt-Berichterstattung. Am besten ist es später, wenn die verhöhnt werden entfernt und die ordnungsgemäße integration-tests werden erstellt, um Sie zu ersetzen, sonst wird Ihr system wird nicht immer geprüft für die Vielzahl von Bedingungen, die Ihre mock nicht simulieren (oder simuliert falsch relativ zu dem realen system).
So, die Frage ist, ob oder nicht zu verwenden, verspottet, es ist eine Frage der Zeit, Sie zu nutzen und, wenn Sie zu entfernen.
InformationsquelleAutor der Antwort Moa