Я зіткнувся з чимось подібним в одному зі старих та застарілих проектів, в яких я працював, який не містить жодного інтерфейсу чи найкращої практики, а також занадто важко змусити їх знову будувати речі або переробляти код через зрілість проектного бізнесу, тому у своєму проекті UnitTest я використовував для створення Wrapper-класів над класами, над якими я хочу знущатися, та інтерфейсу реалізації оболонки, який містить усі мої необхідні методи, які я хочу налаштувати та працювати з ними, тепер я можу знущатись над обгорткою замість реального класу.
Наприклад:
Служба, яку ви хочете перевірити, яка не містить віртуальних методів або інтерфейсу реалізації
public class ServiceA{
public void A(){}
public String B(){}
}
Обгортка до moq
public class ServiceAWrapper : IServiceAWrapper{
public void A(){}
public String B(){}
}
Інтерфейс обгортки
public interface IServiceAWrapper{
void A();
String B();
}
У юніт-тесті тепер можна знущатись над обгорткою:
public void A_Run_ChangeStateOfX()
{
var moq = new Mock<IServiceAWrapper>();
moq.Setup(...);
}
Це може бути не найкращою практикою, але якщо правила проекту змушують вас таким чином, зробіть це. Також помістіть усі свої обгортки всередину вашого проекту Unit Test або Helper, вказаного лише для модульних тестів, щоб не перевантажувати проект непотрібними обгортками або адаптерами.
Оновлення:
Ця відповідь пішла більше року, але цього року я зіткнувся з багатьма подібними сценаріями з різними рішеннями. Наприклад, так просто використовувати Microsoft Fake Framework для створення макетів, підробок і заглушок і навіть тестування приватних та захищених методів без будь-яких інтерфейсів. Ви можете прочитати: https://docs.microsoft.com/en-us/visualstudio/test/isolating-code-under-test-with-microsoft-fakes?view=vs-2017