Ist es ok, um unit-test eine abstrakte Klasse durch Instanziierung als ein mock-Objekt?
Es ist mir zu Ohren gekommen, dass man unit-test eine abstrakte Klasse instanziieren es als mock-Objekt. Damit Sie verhöhnen die abstrakten Eigenschaften und Methoden, während in der Lage zu testen, die implementiert lieben.
Aber ich bin daran gewöhnt, zu unterscheiden zwischen der Klasse zu testen und injiziert Abhängigkeiten zu mock/stub. Also, in diesem frühen Stadium meiner neuen Erleuchtung, die ich Frage mich, ob es irgendwelche Fallstricke, die diese Art und Weise testen?? Irgendwelche Gedanken dazu?
Grüße,
Morten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine abstrakte Klasse, die einen Wert hat, sollte konkrete Unterklassen, die instanziiert werden können. So Gerät diese testen und über Sie implizit die Basisklasse.
Wenn es keine konkrete Unterklassen, ich kann nicht aus irgendeinem Grund denken, warum es existieren sollte (als eine abstrakte Klasse, das ist).
Im Allgemeinen bevorzuge ich Spott nur zum einrichten der Umgebung von der zu testenden Klasse nicht instanziieren der Klasse selbst. Diese Unterscheidung - für mich - hält die test-Fälle klarer, und sorgt dafür, dass ich testen Sie immer die eigentliche Funktionalität der Klasse.
Natürlich, ich kann mir denken, Fälle (mit legacy code), wenn das Hauptproblem ist, um in der Lage zu schreiben unit-tests irgendwie, jedenfalls, zu ermöglichen refactoring (wie besprochen, in Working effectively with Legacy Code " ). Als temporäre Lösung in solchen Fällen (fast) alles geht. Aber sobald die unit-tests sind arbeiten, die Klasse soll umgestaltet werden so schnell wie möglich richtig zu machen, saubere und testbare (und seine unit-tests zu machen, um Sie wartbar).
Abstract*
im Collection-framework).Anstelle der Verwendung von Vererbung zum kombinieren von zwei Klassen, zu sehen, ob Sie verwenden können, Komposition.
Also statt dieser:
Hierzu:
Diese Weise werden Sie nicht haben, um Erben der Klasse in einem unit-test, aber Sie können einfach simulieren Sie eine MoneyTransferrer. Sie können auch testen, die MoneyTransferrer ohne je auf die Basisklasse.
Wenn es nicht eine konkrete Umsetzung in den Teil, den ich Teste, Schreibe ich normalerweise ein test-Durchführung. In das Gerät zu testen, habe ich etwas ähnliches tun, wie die user meiner Klassen gibt. Wenn er erbt meine Klasse, den ich Erben im test.
Auf der anderen Seite, ich würde nicht sagen, dass es schlecht ist zu verwenden ein mock-framework eine Implementierung anlegen. In meinen Fällen, die ich in der Regel nicht funktioniert, meist weil ich schreiben müssen, ORM-mapping-Dateien für die Klasse und so etwas.
Ja, testen Sie eine abstrakte Klasse, ähnlich wie beim testen einer Schnittstelle mit Einspritzung.
Wenn Sie schreiben eine Prüfung für
ILog
und injizieren es für Tests mitMockLog
dann Sie würde das gleiche tun fürLogBase
(was ist eine abstrakte Klasse, in diesem Beispiel) und Spritzen Sie es mitMockLog
genau das gleiche.Einer
abstract class
ist NICHT eininterface
ABER Sie verwendet viel die gleiche von oben.Einer abstrakte Klasse, ist per definition Abstrakt. Es sollte nicht alles sein, um zu testen, ob es wirklich Abstrakt.