Burlarse de los métodos no-virtuales en C ++ sin necesidad de editar el código de producción?

StackOverflow https://stackoverflow.com/questions/2339558

Pregunta

Soy bastante nuevo desarrollador de software que trabaja actualmente la adición de pruebas de unidad a un proyecto existente C ++ que hace años iniciadas. Debido a una razón de carácter no técnico, no se me permite modificar el código existente. La clase base de todos mis módulos tiene un montón de métodos para ajustar / Obtención de datos y la comunicación con otros módulos.

Dado que sólo quiero unidad de prueba de cada módulo individual, quiero ser capaz de utilizar los valores enlatados para todos mis métodos de comunicación entre módulos. Es decir. para un método ping () que comprueba si otro módulo está activo, yo quiero tener que volver verdadero o falso sobre la base de qué tipo de prueba que estoy haciendo. He estado buscando en Google y Google prueba Mock, y lo hace de soporte burlarse de los métodos no-virtuales. Sin embargo, el enfoque descrito ( http://code.google.com/p/googlemock/ wiki / libro de cocina # Mocking_Nonvirtual_Methods ) me obliga a "crear plantillas de" los métodos originales para tomar en cualquiera de los objetos reales o simuladas. No puedo ir y crear plantillas de mis métodos de la clase base debido al requisito mencionado anteriormente, así que necesito alguna otra manera de burlarse de estos métodos virtuales

Básicamente, los métodos que quiero mock son de alguna clase base, los módulos de E desea probar la unidad y crean burla de se derivan clases de esa clase base. Hay módulos intermedios entre ellos mi clase del módulo base y los módulos que desea probar.

Le agradecería cualquier consejo!

Gracias,

JW

editar: a ejemplos más concretos

Mi clase base es rootModule permite por ejemplo, el módulo Quiero prueba es leafModule. Hay un módulo intermedio que hereda de rootModule, hereda leafModule de este módulo intermedio.

En mi leafModule, quiero probar el método hacerTarea (), que llama al GetStatus virtual sin (ModuleName) definido en la clase rootModule. Necesito hacer algún modo GetStatus () para devolver un valor en lata elegido. El imitar es nuevo para mí, así que está utilizando objetos simulados incluso el enfoque correcto?

¿Fue útil?

Solución

Me gustaría escribir un script en Perl / Ruby / Python para leer en el árbol de código fuente original y escribir un árbol de fuentes burlado en un directorio diferente. Usted no tiene que C ++ totalmente de análisis con el fin de sustituir a una definición de función.

Otros consejos

Hay algunas maneras diferentes de sustituir las funciones no virtuales. Uno de ellos es volver a declarar y compilar un nuevo ejecutable de prueba para cada conjunto diferente de funciones no virtuales desea prueba. Eso no es escalable.

Una segunda opción es hacerlos virtual para prueba. La mayoría de los compiladores permiten definir algo en la línea de comandos para compilar el código con -DTEST_VIRTUAL = virtual o -DTEST_VIRTUAL para hacerlos ya sea virtual o normal, dependiendo de si es o no es sometido a prueba o no.

Una tercera opción que puede ser útil es utilizar un marco de burla que le permite burlas de funciones no virtuales. Soy el autor de HippoMocks (descargo de responsabilidad con respecto a la neutralidad, etc.) y que recientemente he añadido la capacidad de burlarse de funciones C de civil en plataformas X86. Esto puede extenderse a funciones miembro no virtuales con un poco de trabajo y sería lo que estás buscando. Tenga en cuenta que, si el compilador puede ver tanto el uso y la definición de una función a la vez que puede inline y que la burla puede fallar. Esto vale en particular para las funciones que se definen en las cabeceras.

Si regulares de burla función C es suficiente para usted, usted puede usarlo como lo es ahora.

Un enfoque sería para especificar diferentes fuentes para la prueba. Digamos que su meta de producción utiliza rootModule.h y rootModule.cpp. Utilizar diferentes fuentes para su objetivo de la prueba. Puede especificar un encabezado diferente cambiando su ruta de inclusión, de manera que #include "rootModule.h" realmente carga unittest / rootModule.h. Entonces simulacro rootModule al contenido de su corazón.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top