En C++, a menudo he hecho que una clase de prueba unitaria sea un amigo de la clase que estoy probando. Hago esto porque a veces siento la necesidad de escribir una prueba unitaria para un método privado, o tal vez quiero acceder a algún miembro privado para que pueda configurar más fácilmente el estado del objeto para que pueda probarlo. Para mí, esto ayuda a preservar la encapsulación y la abstracción porque no estoy modificando la interfaz pública o protegida de la clase.¿Qué hay de malo en hacer que un examen de unidad sea un amigo de la clase que está probando?
Si compro una biblioteca de terceros, no me gustaría que su interfaz pública se contamine con un montón de métodos públicos que no necesito saber simplemente porque el proveedor quería una prueba unitaria.
Tampoco quiero tener que preocuparme por un grupo de miembros protegidos que no necesito saber si estoy heredando de una clase.
Es por eso que digo que preserva la abstracción y la encapsulación.
En mi nuevo trabajo, fruncen el ceño en contra de usar clases de amigos incluso para pruebas unitarias. Dicen que la clase no debe "saber" nada sobre las pruebas y que no desea un acoplamiento estricto de la clase y su prueba.
¿Puede alguien explicarme estas razones más para que pueda entender mejor? Simplemente no veo por qué usar un amigo para las pruebas unitarias es malo.
Me pregunto si también han introducido algunas alternativas. –
las alternativas fue encontrar una manera de invocar el método utilizando la interfaz pública; protegerlo y extender la clase; – cchampion
No querer que las pruebas estén estrechamente relacionadas con el código que prueba parece ser que las buenas intenciones salieron mal. El acoplamiento cerrado entre código "normal" generalmente es algo que se debe evitar, pero las pruebas se combinarán con el código que prueban por definición. –