Java - unit test für eine Methode die nur ein neues Objekt zurück gibt?
Hallo,
wie schreibe ich einen Unit-Test, für eine Methode die nur folgendes macht:
public Foo createFoo() {
return new Foo(this.param1, this.param2);
}
Also zunächst mal will ich den Unit Test nur schreiben um 100% Code-Abdeckung zu erreichen. (Ich weiß das ist nicht immer Sinnvoll, aber eben Vorgabe). Hier passiert ja nichts kritisches.
Ich Arbeite mit JUnit und Mockito.
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.
Und die Attribute param1 und param2 in der Klasse Foo sind private und haben auch keine getter. Somit kann ich auch nicht prüfen, ob diese richtig übergeben wurden.
Wie würdet ihr hier einen Unit-Test schreiben?
Powermock zu verwenden, finde ich für sowas kleines etwas übertrieben.
3 Antworten
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, ...).
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:
- Eine durch param1 und param2 konstruierte
- 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.