Java - unit test für eine Methode die nur ein neues Objekt zurück gibt?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
Unit-Test, für eine Methode die nur folgendes macht

Was die Methode macht, ist beim Testen egal. Wichtig ist nur, was sie machen soll. Schau also in der Spezifikation nach.

Ein Test auf den richtigen Datentyp kann durchaus sinnvoll sein. Er wird z.B. anschlagen, wenn ein Kollege dank seiner tollen IDE statt de.project.Foo plötzlich com.google.ads.Foo importiert. (Ja, sowas kann compilieren und schwer zu entdeckende Fehler verursachen!)

Darüber hinaus kannst Du zugesicherte Eigenschaften für das erzeugte Objekt testen (nicht null, eindeutig, änderbar, ...).

Von Experte JanMarcel01 bestätigt
Ich könnte nun prüfen ob das zurück gegebene Objekt vom Typ Foo ist. Das wäre allerdings Sinnfrei, da die Methode ja gar nichts anderes zurück geben kann.

Sie könnte null zurückgeben. Oder eine Subklasse von Foo, sofern dieses nicht final ist. Ob das zulässig ist, kommt auf die Intention an.

Das wäre allerdings Sinnfrei, da die Methode ja gar nichts anderes zurück geben kann.

Wer sagt, dass nicht im Zuge eines Refactorings nicht mehr Foo, sondern eine Eltern- oder Kindklasse von Foo zurückgegeben wird? Das kann alles passieren und würde ggf. die interne Logik ändern. Besser als auf eine konkrete Instanz zu testen, ist aber auf Eigenschaften, die die Klasse (oder ein übergeordnetes Interface) haben sollte, zu testen.

Im Prinzip sollte man im Kopf immer erst Black-Box-Testen. Was bekommt die Methode und was erwarte ich? Die Methode bekommt nichts und ich erwarte eine durch param1 und param2 konstruierte Foo-Instanz.

Aufgedröselt:

  1. Eine durch param1 und param2 konstruierte
  2. Foo-Instanz.

Beide Punkte sind Kandidaten für Testfälle. Wenn du param1 und param2 aus Foo nicht lesen kannst, erübrigt sich das Testen auf explizite Attributsetzung. Dann bleibt zu überlegen, was param1 und param2 für einen Einfluss auf das Objekt haben und ob das (z.B. davon andere abhängige Attribute) womöglich testbar ist. Allgemein lässt sich das nicht beantworten.

Woher ich das weiß:Berufserfahrung – Software-Entwicklung