Hallo Spaß-Coder.
Weiter geht es mit dem auflösen lästiger Abhängigkeiten, um unseren Code unter Testkontrolle zu bringen und damit sicher ändern können. Wenn ihr die Muster Expose Static Method oder Break Out Method Object ausprobiert habt, habt ihr möglicherweise festgestellt, dass diese beiden Refactoring Pattern ihre Grenzen haben. Was tun, wenn zu viele Methoden der Klasse aufgerufen werden, die uns im Test überhaupt nicht interessieren?
In diesem Fall können wir die Methoden auf unterschiedliche Ober- oder Unterklassen aufteilen um dadurch die Kohärenz der einzelnen Klassen zu erhöhen. Dies erleichtert den Test durch entsprechende Trennung der Verantwortlichkeiten. Die Testaufrufe testen weniger irrelevanten Code und lassen sich auf das Wesentliche fokussieren. Dass auch der Code kleiner, lesbarer und weniger Fehleranfällig wird ist dabei ein positiver Nebeneffekt
Pull up Feature
Ziel:
Doppelte Implementierungen in Unterklassen, die durch gewachsenen Code entstanden sind, werden für den Test durch Verschieben in eine Oberklasse aufgelöst. Damit ist es möglich, fokussierte Tests für relevante Features zu schreiben.
Anleitung:
- Methoden identifizieren, die in eine Oberklasse verlagert werden sollen
- Abstrakte Oberklasse mit diesen Methoden erstellen
- Methoden in die Oberklasse kopieren und kompilieren (Lean on the Compiler)
- Fehlende Referenzen in die Oberklasse kopieren (Preserve Signatures)
- Unterklasse der abstrakten Klasse erstellen und Methoden einfügen, die für den Test benötigt werden
Push down Dependency
Ziel:
Eine bei der Erstellung als allgemeingültig gedachte Methode, die aber nur in einer oder wenigen Unterklassen verwendet wird, wird an die Stelle verschoben, an der sie relevant ist.
Anleitung:
- Klasse mit Abhängigkeiten im Test-Harnisch kompilieren
- Abhängigkeiten durch Compiler identifizieren
- Unterklasse erstellen (Name drückt die Abhängigkeit aus)
- Methoden zu Abhängigkeiten in Unterklasse kopieren, Methoden in Oberklasse protected oder abstract deklarieren; Oberklasse (ursprüngliche Klasse) abstrakt machen
- Test-Unterklasse erstellen und diese im Test verwenden
- Test kompilieren
Zusammenfassung
Durch die genannten Refactoring-Patterns verkleinern wir den getesteten Code und haben damit mehr Flexibilität bei weiteren Refactorings. Auch wird die Testabdeckung fokussierter und bietet uns damit mehr Sicherheit bei weiteren Refactorings und Umbauten des (Legacy-)Codes.
Wir wünschen euch viel Spaß beim Ausprobieren.
Eure Spaß-Coder
Dieser Artikel basiert neben unseren Erfahrungen auf folgenden Quellen:
- Feathers, Michael C. Effektives Arbeiten mit Legacy Code: Refactoring und Testen bestehender Software. mitp Verlags GmbH & Co. KG, 2011.