Me gustaría conocer cómo resolveríais el siguiente escenario.
Tengo una clase TextArea, que utilizainternamente dos clases de una librería de terceros, TextBox3rdParty y Renderer3rdParty. Las dos clases de terceros colaboran entre ellas a la hora de inicializar a mi TextArea.
Quiero configurar un test harness que me permita instanciar mi TextArea e inicializarlo, sin introducir dependencias de terceros en el mismo.
Documentándome un poco, veo que una solución típica es extraer la interfaz que necesitemos de cada clase de terceros, y usar esa interfaz en mi TextArea, de forma que en el test harness usaría sendos mocks de esas interfaces, y eliminaría las dependencias.
Por otro lado, en el código de producción, para que mi TextArea funcione, necesito que use realmente la librería de terceros, Para ello me creo sendos wrappers, TextBox3rdPartyWrapper, y Renderer3rdPartyWrapper, que implementan las interfaces.
En el código de inicialización de mi TextArea, necesito pasar a Renderer una instancia de TextBox. Y aquí viene mi primera duda. Lo que hago en Renderer3rdPartyWrapper, método addTextBox(TextBox* textBox), es un cast de TextBox a TextBox3rdPartyWrapper, y hacer que ésta colabore con el Renderer3rdParty de terceros:
void Renderer3rdWrapper::addTextBox(TextBox* textBox)
{
TextBox3rdPartyWrapper* textBox3rdPartyWrapper = dynamic_cast<TextBox3rdPartyWrapper*>(textBox);
if (textBox3rdPartyWrapper)
mRenderer3rdParty->addTextBox(textBox3rdPartyWrapper->getTextBox3drParty());
}
Un diagrama UML explicativo de la situación es el siguiente:
Y como últimas preguntas/reflexiones: ¿La técnica de "Wrap and Mock" la usaríais siempre y en todos los casos? ¿Dónde ponéis el límite cuando vuestro software depende tanto de un framework de terceros?
Espero que no sea una pregunta demasiado genérica.
¡Gracias!