Wir benennen unsere Testpakete genau wie ihre zu testenden Gegenstücke. Am Ende haben wir also diese Struktur:
src/main/java
com.hello.world
helloWorld.java
src/test/java
com.hello.world
helloWorldTest.java
Ich hatte immer das Gefühl, dass dies nicht besonders klug ist, da man nicht zwischen "test" und "to-test" unterscheiden kann, wenn man nur den Paketnamen angibt. Andererseits habe ich keinen Fall gefunden, in dem das irgendwie wichtig ist. Ist es eine gute Praxis, für beide Pakete (für die Testfälle und die Quellklassen) die gleichen Namenskonventionen zu haben? Wenn nicht, was wäre ein besserer Ansatz?
XXXTest()
in habencom.hello.world.test.helloWorldTest.java
. Allgemeiner Rat wäre, "Test" nur einmal im Pfad erscheinen zu lassen. Verwenden Sie also entweder (a) Test im Paketnamen (und benennen Sie die Testdatei genauso wie die zu testende Datei) oder (b) machen Sie den Paketnamen zum gleich und füge "test" zum Datei- / Klassennamen hinzu.Antworten:
Das ist eine gute Konvention.
Manchmal möchten Sie auch Komponententests für paketprivate Klassen und Methoden schreiben. Sie können sie nicht aus einer Unit-Test-Klasse aufrufen, die in einem anderen Paket enthalten ist.
Es sollte keine Verwirrung darüber geben, dass sich Unit-Test-Klassen im selben Namespace befinden, wie sie sich beim Kompilieren oder Ausführen des Produktionscodes nicht im Klassenpfad befinden sollten.
Hier ist ein Beispiel für ein kleines Modul mit einer öffentlichen Schnittstelle, einer öffentlichen Factory-Klasse und zwei paketprivaten Implementierungsklassen:
Das Ausblenden der Implementierungen der Transmogrifier-Schnittstelle könnte eine gültige Entwurfsentscheidung sein. Vielleicht liegt es in der Verantwortung der Factory-Klasse, die Implementierung auszuwählen.
Da die Implementierungen paketprivat sind, müssen Sie die Komponententestklassen im selben Paket platzieren, wenn Sie sie direkt testen möchten. Wenn Sie Ihre Unit-Test-Klassen in einem anderen Paket haben, haben Sie von Ihren Tests aus nur direkten Zugriff auf die öffentliche Schnittstelle und die Factory-Klasse.
quelle
MapTransmogrifier
undListTransmogrifier
entscheiden, dass sie zu einer Klasse gemacht werden können. Sie erstellen alsoListMapTransmogrifier
, ändern die Factory, um diese zu verwenden, und löschen die beiden Klassen. Der Code wird jetzt nicht kompiliert, daher müssen Sie jeden Test in beiden ändernMapTransmogrifierTest
undListTransmogrifierTest
zum Kompilieren bringen. Ein Test schlägt fehl. War das darauf zurückzuführen, dass die Tests geändert oder erstellt wurdenListMapTransmogrifier
? Heraus kommt der Debugger, um herauszufinden ... alternativ, wenn die Tests die Fabrik verwenden, machen Sie diesen Refactor und alle kompilieren noch ...