2009-06-17 28 views
8

Para fines de prueba de la unidad Estoy tratando de escribir un mock object de una clase sin constructores.¿Es posible extender una clase sin constructores en Java?

¿Esto es posible incluso en Java, de la clase simplemente no es extensible?

+2

La pregunta era ¿se puede burlar, no se puede subclasificar, dada la respuesta aceptada, quizás debería cambiar la pregunta si eso es lo que quería decir? – Yishai

+0

Mis preguntas claramente preguntan acerca de la extensibilidad. Solo menciona la burla como la razón para desear esta extensibilidad. –

Respuesta

18

Una clase sin constructores tiene un constructor implícito de no argumentos público y sí, siempre que no sea final, se puede subclasificar.

Si la clase solo tiene constructores privados, entonces no, no puede.

+0

La clase en cuestión solo tiene constructores privados, incluido el que no tiene argumentos, así que supongo que no he tenido suerte. –

+0

Parece que esa clase no es muy amigable en términos de pruebas. Realmente debería usar interfaces en lugar de tipos concerete ... –

+1

¿Entonces está probando un singleton? Esto siempre resulta ser un dolor en el trasero. –

2

Si la clase Java no tiene ningún constructor definido, entonces no hay ningún problema para usted. Los problemas serán si la clase tendrá cualquier constructor definido y todos serán invisibles para usted (privado).

0

Si solo hay constructores privados, puede seguir utilizando el reflejo para poder acceder a ellos desde fuera de esa clase.

+0

Pero esto no te ayudará a extender la clase. El compilador no le permitirá extender una clase con solo constructores privados. – Eddie

3

La pregunta ha sido respondida, pero para agregar un comentario. Este es a menudo un buen momento para proponer que el código se escriba de forma que se pueda probar.

No se preocupe, investigue lo que se necesita (probablemente la Inyección de Dependencia al menos), aprenda sobre la escritura de simulacros y proponga un conjunto razonable de pautas que permitan que las clases sean más útiles.

Solo tuvimos que volver a escribir un montón de singleton para usar DI porque los singleton son muy difíciles de burlar.

Esto puede no funcionar bien, pero un nivel de codificación para la capacidad de prueba es estándar en la mayoría de las tiendas profesionales.

+0

La clase que estaba buscando para burlarse era una clase de Blackberry sobre la que no tengo control. –

+0

Haces un buen punto (asumiendo que uno es un código de burla que pueden cambiar), pero esto probablemente debería haberse ingresado como un comentario en lugar de una respuesta. – hotshot309

+0

Estoy de acuerdo, pero la incapacidad de separar el texto en párrafos en los comentarios a menudo me deja frustado, pero en estos días (tres años más tarde) creo que hubiera hecho eso, vivir y aprender. –

3

Sí, puedes simularte con el objeto, aunque puede que no sea posible crear una subclase (sin duda, no sin ser muy íntimo con el cargador de clases). Here es cómo lo haces con JMock.

Burlarse de esta manera le permite mantener el tipo, sin subclases, aunque probablemente sea bastante difícil o imposible desentrañar solo cierto comportamiento. Por lo tanto, este método es apropiado para probar clases que usan esta clase, no para probar la clase en sí.

Si realmente tiene acceso al código fuente de la clase, puede implementar una clase interna que le permita ampliarla, aunque si pudiera hacerlo, también podría hacer que uno de los paquetes de constructores sea privado.

También hay idiomas dinámicos que te permitirán hacer las subclases e implementar una interfaz Java con la que el código Java pueda interactuar, pero no estoy tan familiarizado con los detalles.

1

Puede simular la clase, y cualquiera o todos sus constructores, usando JMockit.

Es un kit de herramientas de burla para Java que le permite burlarse de casi cualquier cosa. Incluso si la clase no es pública y/o está anidada, todavía se puede burlar. Hay varios mecanismos en JMockit que se pueden usar para eso. La distribución del juego de herramientas contiene muchas muestras de pruebas JUnit también.

Si la clase implementa alguna interfaz o amplía una clase abstracta, puede indicarle a JMockit que "capture" y simule implementaciones del tipo base bajo demanda, tal como las carga la JVM, e incluso asigne las instancias creadas a un campo en la clase de prueba.

Cuestiones relacionadas