2010-06-19 9 views
6

Estoy tratando de probar una clase en un código Java que he heredado.¿Cómo se prueba una clase derivada de una clase base con muchas dependencias?

El problema es que se deriva de una clase que es parte del trabajo de la aplicación de la compañía. En la construcción, la clase base hace todo tipo de cosas 'inteligentes', iniciando conexiones a todo tipo de servicios que se necesitan en tiempo de ejecución.

Pero para fines de pruebas unitarias no necesito nada de eso. Solo necesito crear una instancia de la clase derivada y luego puedo ejercitarla. Si alguna prueba necesita específicamente parte de la jerarquía, puedo burlarme de ellas.

Entonces, ¿cómo puedo romper esta dependencia?

Respuesta

3

Así que tiene una clase base y una clase extendida. Vea si puede refactorizar la clase extendida para no extender la clase base, sino usarla en su lugar. Entonces, cuando llamó por primera vez al parent::fooBar(), ahora llama al this.baseInstance.fooBar(). De esta forma, puede inyectar otra baseInstance para fines de prueba.

Si realmente necesita extender la clase base para anular algo, extraiga la funcionalidad a una tercera clase y convierta la clase extendida en un proxy. La clase extendida no hace más que llamar a métodos en la tercera clase. P.ej.

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

De esta manera, puede probar la implementación real, sin instanciar la clase base.

7

La herencia puede ser tan frágil.

¿Es necesario heredar? Todas las cosas "inteligentes" que hace la clase base (por ejemplo, establecer conexiones) son cosas que un motor de inyección de dependencias normalmente proporcionaría.

Parece que su clase estaría mejor desde el punto de vista de la prueba y el tiempo de ejecución si encuentra una forma de no heredar y obtener las dependencias satisfechas por un motor DI. ¿Posible?

1

Tuvimos un problema similar. Muchas de las clases y dependencias de nivel de marco. Lo resolvimos usando DI

+0

Creo que Guice es el mejor marco DI, Spring es también Java 1.4. – IAdapter

+0

Java 1.4? Con la configuración por anotación? No tan. Sería justo señalar que fue concebido como una respuesta a las deficiencias en J2EE y EJB 2.0, pero "también Java 1.4" no es correcto. Guice puede ser un buen marco DI, pero Spring es mucho más que eso. Es persistencia, mensajería, comunicación remota y mucho más construido sobre DI y AOP. – duffymo

0

Estoy de acuerdo con los otros que sugieren que la inyección de dependencia es el camino a seguir en el largo plazo. Como un truco a corto plazo, podrías intentar introducir un indicador "global" que deshabilite el código de inicialización inteligente para probar.

Cuestiones relacionadas