2010-06-19 8 views
6

Ich versuche, eine Klasse in einigen Java-Code zu testen, die ich geerbt habe.Wie Unit-Test eine Klasse von einer Basisklasse mit vielen Abhängigkeiten abgeleitet?

Problem ist, dass es von einer Klasse ableitet, die Teil der Anwendung Framwork des Unternehmens ist. Bei der Konstruktion führt die Basisklasse alle möglichen "cleveren" Dinge aus und initialisiert Verbindungen zu allen Arten von Diensten, die zur Laufzeit benötigt werden.

Aber für Unit-Testzwecke brauche ich nichts davon. Ich muss nur eine Instanz der abgeleiteten Klasse erstellen und dann kann ich sie trainieren. Wenn ein Test speziell einen Teil der Hierarchie benötigt, kann ich sie nachahmen.

Also, wie kann ich diese Abhängigkeit brechen?

Antwort

3

Sie haben also eine Basisklasse und eine erweiterte Klasse. Prüfen Sie, ob Sie die erweiterte Klasse so umformen können, dass sie die Basisklasse nicht mehr erweitert, sondern stattdessen verwendet. Also wo Sie zuerst parent::fooBar() angerufen haben, rufen Sie jetzt this.baseInstance.fooBar(). Auf diese Weise können Sie eine andere baseInstance für Testzwecke injizieren.

Wenn Sie die Basisklasse wirklich erweitern müssen, um etwas zu überschreiben, extrahieren Sie die Funktionalität in eine dritte Klasse und machen Sie die erweiterte Klasse zu einem Proxy. Die erweiterte Klasse führt nur Methoden der dritten Klasse aus. Z.B.

protected fooBar() { 
    return this.realImplementation.fooBar(); 
} 

Auf diese Weise können Sie die tatsächliche Implementierung testen, ohne die Basisklasse zu instanziieren.

7

Vererbung kann so brüchig sein.

Ist Vererbung eine Voraussetzung? All das "clevere" Zeug, das die Basisklasse tut (z. B. das Herstellen von Verbindungen), sind Dinge, die eine Engine für die Abhängigkeitsinjektion normalerweise bereitstellen würde.

Ihre Klasse hört sich so an, als wäre es sowohl vom Test- als auch vom Laufzeit-Standpunkt besser, wenn Sie einen Weg finden, seine Abhängigkeiten nicht durch eine DI-Engine zu erben und zu erhalten. Möglich?

1

Wir hatten ein ähnliches Problem. Viele Framework-Level-Klassen und Abhängigkeiten. Wir haben es gelöst mit DI

+0

Ich denke, Guice ist das beste DI-Framework, Spring ist auch Java 1.4. – IAdapter

+0

Java 1.4? Mit Konfiguration durch Annotation? Nicht so. Es wäre fair, darauf hinzuweisen, dass es als Antwort auf Mängel in J2EE und EJB 2.0 konzipiert wurde, aber "zu Java 1.4" ist nicht korrekt. Guice mag ein guter DI-Rahmen sein, aber der Frühling ist weit mehr als das. Es ist Persistenz, Messaging, Remoting und vieles mehr auf DI und AOP. – duffymo

0

Ich stimme den anderen zu, die vorschlagen, dass die Abhängigkeitsinjektion der Weg ist, auf lange Sicht zu gehen. Als Kurzzeit-Hack könnten Sie versuchen, ein "globales" Flag einzuführen, das den cleveren Initialisierungscode zum Testen deaktiviert.

Verwandte Themen