Me enfrenté a algo así en uno de los proyectos antiguos y heredados en los que trabajé que no contiene interfaces o mejores prácticas y también es demasiado difícil hacerlos cumplir, construir cosas nuevamente o refactorizar el código debido a la madurez del negocio del proyecto, así que en mi proyecto UnitTest, solía crear un Wrapper sobre las clases que quiero simular y esa interfaz de implementación de envoltorio que contiene todos mis métodos necesarios con los que quiero configurar y trabajar.Ahora puedo simular el envoltorio en lugar de la clase real.
Por ejemplo:
Servicio que desea probar que no contiene métodos virtuales o interfaz de implementación
public class ServiceA{
public void A(){}
public String B(){}
}
Envoltorio a moq
public class ServiceAWrapper : IServiceAWrapper{
public void A(){}
public String B(){}
}
La interfaz Wrapper
public interface IServiceAWrapper{
void A();
String B();
}
En la prueba unitaria, ahora puede simular la envoltura:
public void A_Run_ChangeStateOfX()
{
var moq = new Mock<IServiceAWrapper>();
moq.Setup(...);
}
Puede que esta no sea la mejor práctica, pero si las reglas de su proyecto lo obligan a hacerlo, hágalo. También coloque todos sus Wrappers dentro de su proyecto de prueba unitaria o proyecto Helper especificado solo para las pruebas unitarias para no sobrecargar el proyecto con envoltorios o adaptadores innecesarios.
Actualización:
esta respuesta de más de un año, pero en este año enfrenté muchos escenarios similares con diferentes soluciones. Por ejemplo, es muy fácil usar Microsoft Fake Framework para crear simulacros, falsificaciones y stubs e incluso probar métodos privados y protegidos sin interfaces. Puede leer: https://docs.microsoft.com/en-us/visualstudio/test/isolates-code-under-test-with-microsoft-fakes?view=vs-2017