2011-03-01 6 views
5

Soy nuevo en la inyección de dependencia. Estoy un poco confundido espero que alguien pueda ayudarme ...Agregar más dependencias a una clase suena como demasiado trabajo

Supongamos que tenemos una clase A que tiene una dependencia (interfaz IB) inyectada a través del constructor. digamos que he escrito docenas de casos de prueba escritos para la clase A, ahora en una etapa posterior descubro que necesito una dependencia más para la clase A (por ejemplo, CI de interfaz). ¿Esto significa que tengo que modificar mi constructor y todos los casos de prueba junto con él? Como crearé objetos para la clase A en los casos de prueba.

EDITAR: También tener que modificar todos los casos de prueba aumenta la posibilidad de que podamos cometer algún error en el caso de prueba.

+0

Si no está utilizando un marco probablemente sí, pero hay herramientas para ayudarle a hacer eso de forma automática, es decir para especificar cómo crear objetos en archivos de configuración (por ejemplo) para que el framework sabe cómo crear tu clase. El problema es que si su código no se inicia con inyección de dependencia, puede tener un alto costo inicial. –

+0

Sí, he pensado que uno de ellos ... comenzará con un nuevo proyecto. Además, si mi firma del constructor está cambiando, ¿no puedo ver cómo un marco lo hará por mí? –

Respuesta

8

Esto es no es un problema con DI; es un problema con las pruebas. Más específicamente, usted está sufriendo del olor Fragile Test.

Esto puede abordarse utilizando un SUT Factory en lugar de crear el SUT directamente utilizando la palabra clave new. Esto le permitirá cambiar la firma del constructor en el futuro sin romper muchas pruebas.

5

Esta es una buena pregunta. Creo que hay dos partes: la necesidad real de cambiar la firma del constructor y el acto de introducir una nueva dependencia. Agregar nuevo parámetro al constructor no debe ser demasiado engorroso, especialmente teniendo en cuenta las herramientas para refactorizar en IDE contemporáneos (por ejemplo, Cambiar firma de método en Eclipse) que agregarán parámetros y cambiarán todos los lugares donde se llame a este constructor.

Por otro lado, la introducción de una nueva dependencia siempre es una oportunidad para refactorizar en mi opinión. Si su clase A no puede lograr su funcionalidad sin una nueva dependencia, tal vez comience a asumir demasiada responsabilidad.

Un truco que podría ayudarlo a superar la necesidad de cambiar el código para la creación de objetos en pruebas en muchos lugares es utilizar una fábrica dedicada que se encargue de la preparación de la instancia del objeto en estado listo para probar. No tiene que usar la fábrica en producción (el contenedor DI hace exactamente lo mismo) pero en el código de prueba puede ser útil.

1

Sí, altera su constructor y sus pruebas. Si descubrieras que el mundo era redondo, no continuarías probándolo por lo plano, ¿verdad? :-) Con talones adecuados, el trabajo extra no será tan difícil. Lo hago todo el tiempo. Es el corazón de TDD.

Saludos, Morten

Cuestiones relacionadas