Questa è una buona convenzione.
A volte vuoi scrivere anche unit test per classi e metodi privati del pacchetto. Non sarai in grado di chiamarli da una classe di test dell'unità collocata in un altro pacchetto.
Non dovrebbe esserci confusione circa l'avere classi di test unitarie nello stesso spazio dei nomi che non dovrebbero trovarsi nel percorso della classe durante la compilazione o l'esecuzione del codice di produzione.
Ecco un esempio di un piccolo modulo con un'interfaccia pubblica, una classe factory pubblica e due classi di implementazione private del pacchetto:
src/main/java:
com.hello.transmogrifier
public interface Transmogrifier
public class TransmogrifierFactory
class MapTransmogrifier implements Transmogrifier
class ListTransmogrifier implements Transmogrifier
scr/test/java:
com.hello.transmogrifier
public class TransmogrifierFactoryTest
public class MapTransmogrifierTest
public class ListTransmogrifierTest
Nascondere le implementazioni dell'interfaccia Transmogrifier potrebbe essere una valida scelta progettuale. Forse è responsabilità della classe factory scegliere l'implementazione.
Poiché le implementazioni sono private del pacchetto, è necessario posizionare le classi di test dell'unità nello stesso pacchetto se si desidera testarle direttamente. Se hai classi di test unitarie in qualche altro pacchetto, dai tuoi test hai solo accesso diretto all'interfaccia pubblica e alla classe factory.