2013-04-05 7 views
5

Ich fange an, JUnit-Testfälle für eine ältere Codebasis zu schreiben. Eine der öffentlichen Methoden verfügt über mehrere if-Anweisungen und basiert auf einer Bedingung, die verschiedene private Methoden aufruft.
Sollte ich nur eine Testmethode schreiben und für alle Bedingungen testen? oder eine Methode für jede Bedingung?Junit Best Practice: Öffentliche Methode, die mehrere private Methoden aufruft

Würde ich nicht die Konsistenz verlieren, wenn ich für jede if-Bedingung individuelle Methoden schreibe?

Was ist der Ansatz, um private Methoden zu testen? Private Methodenlogik könnte komplizierter sein als öffentliche Methoden.

Antwort

4

Basieren Sie die Anzahl der Methoden auf der Anzahl der Szenarien, die Sie testen möchten, es hat nichts mit den Methoden zu tun, die das Ding getestet hat.

Wenn für jedes Szenario ein eigener Code eingerichtet wird, erhalten Sie für jedes Szenario eine Testmethode. Wenn Sie die Tests parametrisieren können, können Sie möglicherweise eine Testmethode verwenden und für jedes Szenario unterschiedliche Daten übergeben.

Wichtig ist, dass für jede Kombination von Eingaben der Test unabhängig von den anderen Tests erfolgreich sein oder fehlschlagen soll. Wenn Sie alle Tests auf eine Methode schärfen, kann das nicht passieren. Der erste Testfehler verhindert, dass die verbleibenden Tests ausgeführt werden.

0

Aus meiner Sicht führt normalerweise kleinere Einheiten in Unit Tests zu besseren Tests. Für Sie würde dies bedeuten, die privaten Methoden zu privaten Paketen zu ändern und Tests für jede von ihnen zu schreiben.

+0

Kann das nicht tun. Es ist ein Legacy-Code und einige der Logik können nicht als öffentlich herausgestellt werden. –

+0

Ich würde es nicht öffentlich machen, sondern privat verpacken und sicherstellen, dass die Tests im selben Paket sind (durch Trennung von Produktions- und Testquellen). – user2088476

1

Ich stimme Nathan zu. Tests sollten nach Szenarien und nicht nach Methoden erfolgen. Manchmal wird Legacy-Code so geschrieben, dass Sie private Methoden direkt testen müssen. Und ja, der Code sollte überarbeitet werden. Aber wenn man nicht einen Test an Ort und Stelle Refactoring oder zuerst wollen ...

Option 1 - Paket machen Methoden privaten Zugang

Dies ist ein sehr sicheres Refactoring.

Option 2 - Verwendung Reflexion der statischen Methode

direkt anrufen, wenn man wirklich den Code nicht berühren kann, dann ist dies das Beste, was Sie tun können. Ich würde die Anforderung in Frage stellen, den Code nicht zu berühren. Wenn wir den Code nicht verbessern können, sollten wir ihn in der Ecke lassen, um zu verrotten?

+1

vielleicht könnte das Schreiben der Tests in Groovy (was Privatsphäre nicht respektiert) eine andere Option sein . –

+0

@NathanHughes ausgezeichneter Vorschlag! –

Verwandte Themen