Sollte ich unit test Methoden, die vererbt werden, von der super-Klasse?
Schreibe ich momentan eine Implementierung der JDBC-Treiber (ja, Sie haben richtig gelesen) in TDD-Manier, und zwar habe ich nur fertige Klasse stubs an diesem Punkt, und nur einige kleinere Funktionen, nur es fiel mir auf, daß da Statement
ist eine Superklasse für PreparedStatement
das ist eine Superklasse für CallableStatement
, was soll ich tun, wenn ich wirklich anfangen zu schreiben, tests für meine Implementierungen dieser Klassen, welche von diesen soll ich tun:
- Erstellen einer test-suite für
Statement
und dann erweitern, die suite für zusätzliche tests fürPreparedStatement
und dann das gleiche tun fürCallableStatement
. - Test in jeder Implementierung individuell ignorieren der geerbten Methoden aus der Superklasse(N).
- Gründlich zu testen jeder einzelnen Methode individuell für jede Implementierung der Klasse; Es ist möglich, dass einige ererbte Methoden funktionieren anders, je nach Umsetzung, nachdem alle. Milde Variante wäre, dass ich würde testen alle diejenigen, die geerbten Methoden der Implementierung verwendet.
Nummer zwei fühlt die natürlichen aber aus dem Grund lege ich die Dritte bin ich nicht sicher, ob es wäre klug, dies zu tun. Also, was tun Sie denke, dass ich tun soll?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich möchte ausdrücklich nie tun alternative 1 (lassen sich die test-Klassen-Hierarchie werden die gleichen wie die eigentlichen Klassen-Hierarchie) wenn dies bedeutet, dass Sie die gleichen tests wiederholt für jede test-Unterklasse. Ich bin auch generell skeptisch Unterklassen test anderen Klassen als die Allgemeine Nützlichkeit Basisklasse.
Ich normalerweise 1-test für jede Klasse in einer Hierarchie, Abstrakt oder nicht. Also die Basisklasse hat einen separaten test (in der Regel mit einem test-lokale private Unterklasse, die verwendet wird, um es zu testen um genau zu sein), und ich nutze mein wissen um die Unterklassen zu schreiben, die richtigen tests für jede Unterklasse. Ich kann sehen, dass in der Abdeckung läuft, was fehlt, tests, also ich bin in der Regel nicht zu formalisiert up-front.
"testen Sie jede einzelne Methode individuell für jede Implementierung der Klasse"
Insbesondere, Fehler zu überschreiben einer superclass-Methode richtig ist ein allgemeiner Fehler. Der Autor der Unterklasse Annahmen über die Oberklasse. Die Oberklasse ändert, und die Unterklasse ist nun gebrochen.
A
- und UnterklassenB
undC
.A
hat Methodea()
die wederB
nochC
haben, überschrieben. Du sagst, dass, dennoch, meine tests testen müssenA.a()
,B.a()
,C.a()
ist, obwohl er die Prüfung der exakt gleichen Methode (wederB
nochC
außer Kraft setzen, nur vererben) 3 verschiedene Zeiten?? Vergessen Sie TROCKEN, wenn Tests, die ich denke,Genügend tests, so dass Sie sich wohl fühlen - auf der Grundlage Ihrer Kenntnisse der Umsetzung. Ich nicht behandeln, unit-Tests als komplett black-box-Tests. Wenn Sie wissen, dass die Basisklasse ruft nie alle virtuellen Methoden (oder zumindest keine, die überschrieben werden), dann beachten Sie, dass der Tat, aber nicht effektiv duplizieren Sie die unit-tests, die Sie schon haben.
Unit-Tests kann sicherlich auf die Spitze getrieben - es lohnt sich immer, den Ausgleich der Wert, Sie bekommen von es mit die Anstrengung, die es Sie kostet.
Mit TDD, sollten Sie nicht wollen, zu Methoden der Prüfung, sondern das Verhalten oder den Fähigkeiten Ihres Codes. Deshalb ist bei der Implementierung einer Unterklasse, die Sie einschränken können, um die Prüfung nur die Verhaltensweisen, die unterschiedlich sind von der Basisklasse. Wenn Sie Zweifel haben, schreiben Sie einen neuen test.