Wir hatten gerade eine kleine Diskussion über Unit-Tests von privaten Methoden.
Es gibt hier zwar einige Möglichkeiten, aber keine ist so richtig toll. Wie macht man das?
1. Gar nicht. Es wird nur die öffentliche Schnittstelle getestet (Blackbox). Private Methoden werden dabei indirekt mitgetestet.
2. Keine privaten Methoden verwenden. Alle Methoden sind mindestens Package-protected, die Unit-Tests befinden sich im selben Paket.
3. Über innere Klassen. Die zu testende Klasse beinhaltet eine innere Testklasse. Die class-Dateien kann man bei Deployment ausklammern.
4. Über Reflection.
zu 1: Grundsätzlich sicherlich richtig, aber es ist allerdings nicht immer praktikabel. Manchmal will man eine umfangreiche Methode
in viele kleine (private) aufteilen. Warum dann nicht auch die testen? Es ist ja viel einfacher, möglichst kleine Units zu behandeln
als große - z.B. die Erzeugung der Testdaten, Testabdeckung ist leichter herzustellen usw. Nachteil wäre ein höherer Aufwand beim Refactoring.
zu 2: Verletzt Kapselung und Geheimnisprinzip. Kommt für mich nicht in Frage.
zu 3: Auch schlecht. Ich möchte keine Tests in meinen Klassen.
zu 4: Unschön zu programmieren, aber mit ein paar Hilfsmethoden wird's schon gehen. Ist wohl die beste Lösung.
Wie macht ihr das?
Es gibt hier zwar einige Möglichkeiten, aber keine ist so richtig toll. Wie macht man das?
1. Gar nicht. Es wird nur die öffentliche Schnittstelle getestet (Blackbox). Private Methoden werden dabei indirekt mitgetestet.
2. Keine privaten Methoden verwenden. Alle Methoden sind mindestens Package-protected, die Unit-Tests befinden sich im selben Paket.
3. Über innere Klassen. Die zu testende Klasse beinhaltet eine innere Testklasse. Die class-Dateien kann man bei Deployment ausklammern.
4. Über Reflection.
zu 1: Grundsätzlich sicherlich richtig, aber es ist allerdings nicht immer praktikabel. Manchmal will man eine umfangreiche Methode
in viele kleine (private) aufteilen. Warum dann nicht auch die testen? Es ist ja viel einfacher, möglichst kleine Units zu behandeln
als große - z.B. die Erzeugung der Testdaten, Testabdeckung ist leichter herzustellen usw. Nachteil wäre ein höherer Aufwand beim Refactoring.
zu 2: Verletzt Kapselung und Geheimnisprinzip. Kommt für mich nicht in Frage.
zu 3: Auch schlecht. Ich möchte keine Tests in meinen Klassen.
zu 4: Unschön zu programmieren, aber mit ein paar Hilfsmethoden wird's schon gehen. Ist wohl die beste Lösung.
Wie macht ihr das?