Recht häufig kommt die Frage, "wie eine abstrakte Klasse Komponententest?". Sie verlängern, dann ersetzen die abstrakten Methoden mit Stubs und testen Sie dann nur den konkreten Teil der Methode? Oder entwickeln Sie einen abstrakte Einheit-Test?
Wir denken, dass dies vermutlich die falsche Frage zu stellen, wenn es um abstrakte Klassen geht. Tatsächlich denken wir, es ist eine gute Möglichkeit das Problem ganz zu vermeiden. Wenn man bedenkt, dass eine abstrakte Basisklasse Klasse es gibt wirklich zwei Standardmethoden der Annäherung an das:
Die erste ist, wo Sie brauchen, ein abstraktes Objekt zu spezialisieren. In diesem Fall finden Sie fast sicher, dass die Clients müssen die abstrakte Klasse, die Sie erstellen über eine Basisschnittstelle verwenden.
In der zweiten Instanz bauen Sie die abstrakte Klasse zu versuchen, zu reduzieren auf Vervielfältigung. In diesem Fall werden Sie schnell sehen, dass die Kunden eigentlich konkrete Versionen der Klasse zugreifen Wenn sie sie über eine Schnittstelle zugreifen.
Eine Änderung der Entwicklungsansatz des Software-Tests
Nehmen Sie die erste Methode, die oben müssen bereits eine Schnittstelle Sie die vollständig definiert worden ist. Das ist durch den Prozess der virtuellen Methoden innerhalb der Klassen, die von Ihr neu abgeleiteten Klassen umgesetzt. Warum nicht machen, dass eine echte Schnittstelle Schnittstelle? Sie tauschen die abstrakte Klasse für eine konkrete. Dann nehmen Sie einen Snapshot der neuen Schnittstelle aus dem Konstruktor. Alle abgeleiteten Klassen können dann die reale Schnittstelle nutzen.
Dies macht die abstrakte Klasse testen einfach. Sie nur ein Mock der Schnittstelle verwenden und zusätzliche Implementierungen nutzen, was ist jetzt eine echte Schnittstelle arbeiten.
Für die zweite Methode funktioniert dies bereits als eine Hilfsklasse. Sie können prüfen die Funktionalität innerhalb dieser abstrakten Klasse und versuchen und es in die Objekte, die, denen Sie mit arbeiten. Wenn Sie finden, es gibt noch Material innerhalb dieser Klassen, wenn das fertig ist - machen sie eine Hilfsklasse im Konstruktor (vergessen Sie nicht, die Basisklasse mitnehmen) und es ist eine konkrete Implementierung. Dies ist viel einfacher, ein Abstract zu testen.
Ist es möglich, die Methoden 1 und 2 kombinieren, und wir haben festgestellt, dass am besten Ansatz, der den Ansatz für die zweite Methode verwenden und dann einfach die Vererbungsstruktur und wandeln es in ein Strategie-Muster ist.
Der beste Weg zur Einheit Test abstrakte Klassen ist einfach Klasse zu etwas einfacher zu handhaben zu reduzieren.