2010-06-19 14 views
6

Sto cercando di testare una classe in un codice Java che ho ereditato.Come testare una classe derivata da una classe base con molte dipendenze?

Il problema è che deriva da una classe che fa parte dell'applicazione desktopwwork. Al momento della costruzione, la classe base esegue tutti i tipi di cose "intelligenti", inizializzando le connessioni a tutti i tipi di servizi necessari in fase di runtime.

Ma per scopi di test unitario non ho bisogno di nulla. Ho solo bisogno di creare un'istanza della classe derivata e quindi posso esercitarla. Se qualche test ha specificamente bisogno di parte della gerarchia, posso prenderli in giro.

Quindi, come posso interrompere questa dipendenza?

risposta

3

Quindi hai una classe base e una classe estesa. Vedi se puoi rifattorizzare la classe estesa per non estendere più la classe base, ma usarla al suo posto. Quindi, dove prima hai chiamato parent::fooBar(), ora chiami this.baseInstance.fooBar(). In questo modo, puoi iniettare un'altra BaseInstance a scopo di test.

Se è davvero necessario estendere la classe base per sovrascrivere qualcosa, estrarre la funzionalità in una terza classe e rendere la classe estesa un proxy. La classe estesa non fa altro che chiamare i metodi sulla terza classe. Per esempio.

protected fooBar() { 
    return this.realImplementation.fooBar(); 
} 

In questo modo è possibile testare l'implementazione reale senza creare un'istanza della classe base.

7

L'ereditarietà può essere così fragile.

L'ereditarietà è un requisito? Tutta quella roba "intelligente" che sta facendo la classe base (ad es. Stabilire connessioni) sono cose che un motore di iniezione di dipendenza normalmente fornirebbe.

La classe sembra che sarebbe meglio sia da un punto di vista di test e di runtime se si trova un modo per non ereditare e ottenere le sue dipendenze soddisfatte da un motore DI. Possibile?

1

Abbiamo avuto un problema simile.Potere di classi e dipendenze a livello di framework. Lo abbiamo risolto usando DI

+0

Penso che Guice sia il migliore framework DI, Spring è troppo Java 1.4. – IAdapter

+0

Java 1.4? Con la configurazione per annotazione? Non così. Sarebbe giusto sottolineare che è stato concepito come una risposta alle carenze in J2EE e EJB 2.0, ma "too Java 1.4" non è corretto. Guice potrebbe essere un buon quadro DI, ma la primavera è molto più di questo. È persistenza, messaggistica, servizi remoti e molto altro ancora basato su DI e AOP. – duffymo

0

Sono d'accordo con gli altri che suggeriscono che l'iniezione di dipendenza è la strada da percorrere a lungo termine. Come trucco a breve termine, potresti provare a introdurre un flag "globale" che disabilita il codice di inizializzazione intelligente per il test.

Problemi correlati