2012-04-13 14 views
8

È consigliabile cambiare i metodi privati ​​in protetti per i test JUNIT?Modifica dei metodi privati ​​protetti per i test

+0

Perché dovrebbe? Tu cambi qualcosa prima di testare, non posso vederne alcuna ragione? – Nanne

+2

Quasi certamente non è una buona idea; se stai testando direttamente i metodi interni di una classe, dovresti prendere in considerazione il refactoring in una classe separata. –

+0

L'ho fatto nei casi in cui un metodo privato restituisce alcune risorse che non sono disponibili nell'ambiente di testing dell'unità e voglio testare un altro metodo (non privato) che lo chiama. Rendendolo protetto, posso sovrascriverlo, in modo che restituisca alcuni stub/mock invece della risorsa non disponibile. Questo ha significato che un test unitario diventa quindi fattibile e non sono stato in grado di trovare un altro modo per aggirare questo, ma non è l'ideale. –

risposta

9

A volte è utile, sì.

Se la classe è estensibile, assicurarsi di rendere il metodo definitivo.

Inoltre, documentare il fatto che il metodo non deve essere chiamato da sottoclassi o classi esterne dello stesso pacchetto.

Io uso l'annotazione Guava @VisibleForTesting per chiarire che il metodo dovrebbe in effetti essere privato.

+0

Grazie per avermi aperto gli occhi su @VisibleForTesting. Non sapevo che esistesse. Ritiene ancora che questo sia un po 'imperfetto in quanto influisce sulla sintassi dell'implementazione solo ai fini del test, ma è meglio che esporre membri e metodi che dovrebbero essere privati. E limitare i test ai metodi di interfaccia sembra una restrizione eccessivamente severa e talvolta poco pratica. – Lolo

4

È possibile invece impostare il pacchetto dei metodi locale.

È possibile chiamare il metodo privato utilizzando la riflessione oppure è possibile decidere che i metodi private non debbano essere testati direttamente, solo indirettamente.

5

No in generale no. L'idea del test unitario è di testare ... le unità. O in altre parole implementazioni di metodi di interfaccia. Se vuoi testare un metodo che non puoi "vedere" questo potrebbe essere un odore di codice. Forse non hai separato abbastanza la tua logica di business dal codice dell'interfaccia utente o qualcosa del genere.

Quindi l'idea migliore sarebbe quella di ripensare la tua architettura. Ma se l'alternativa sarebbe quella di non testare il tuo codice, è una buona idea rendere questi metodi protetti.

1

Sebbene si preferisca il refactoring come suggerito da @ user714965, il MockPrivate di PowerMock può eseguire la simulazione senza aprire la visibilità dei propri metodi privati.

Scrivere i test prima di solito porta a un progetto in cui non è necessario prendere in giro metodi privati.

Problemi correlati