2015-01-15 20 views
7

Ho una classe che ha la responsabilità di importare i contratti da un CSV al database.Classe di test Java con molti metodi privati ​​

La classe stessa ha solo un metodo pubblico che avvia l'importazione e gli altri metodi sono tutti privati ​​(perché solo la classe stessa utilizzerà e la logica è la stessa).

Sto iniziando a fare test per questa classe usando Spock e ci sono molti metodi privati, come dovrei testarlo?

Devo renderli pubblici per testare? Prova solo il metodo principale, quello pubblico?

Qual è il migliore?

+0

Se è necessario eseguire un test JUnit su tali metodi, è necessario che siano "pubblici". Potrebbe causare problemi per farlo? – Ascalonian

+1

È possibile convertire questi metodi privati ​​in metodi di pacchetto (anziché pubblici), quindi il test deve essere nello stesso pacchetto. – Gus

+1

Ti consiglio di leggere questo post in SO: http://stackoverflow.com/questions/105007/should-i-test-private-methods-or-only-public-ones –

risposta

11

In teoria, i metodi privati ​​vengono utilizzati in ultima analisi con uno dei metodi pubblici oppure non vengono utilizzati affatto. In genere, si configurano i test per chiamare i metodi pubblici con il contesto necessario in modo che colpiscano i metodi privati.

I test di unità stanno principalmente testando l'unità di compilazione (vale a dire la classe). È possibile unire i metodi di test direttamente ma poi devono essere pubblici, il che va contro l'avere una bella API pulita.

Quindi prova il tuo metodo pubblico abbastanza per colpire tutti i metodi privati. I metodi privati ​​sono meccanismi interni della classe, non è necessario testarli direttamente.

+0

Thx, ci proverò così! –

2

Alcune persone sostengono che si dovrebbe testare solo l'API (i.e. I metodi pubblici).

Una possibile soluzione è utilizzare il pacchetto privato in modo che solo le classi nello stesso pacchetto possano accedere a tali metodi.

Personalmente, non testerei i metodi privati, mi concentrerei sui metodi pubblici che si comportano come previsto. Se ritieni che i tuoi metodi privati ​​abbiano un peso eccessivo, forse lo fanno e dovresti separare ulteriormente la funzionalità.

0

Se la classe implementa un'interfaccia, è possibile rendere "pubblici" tutti i metodi che si desidera testare, ma non aggiungerli all'interfaccia. In questo caso sarai in grado di accedere a questi metodi dal test ma non da te src.

1

È possibile utilizzare la riflessione per ottenere ciò. La classe Method ha un metodo chiamato setAcessible (boolean) che consente di chiamarlo anche se dichiarato come privato/protetto/predefinito. Vedere l'esempio di seguito:

YourClass yourClassInstance = new YourClass(); 
Method yourMethod = YourClass.class.getDeclaredMethod("yourMethod", null); 
yourMethod.setAccessible(true); 
Object[] parameters = new Object[1]; 
parameters[0] = "A String parameter"; 
Object result = yourMethod.invoke(yourClassInstance, parameters); 
Problemi correlati