У нас есть следующая проблема: ряд классов, к которым мы не можем прикоснуться, но которым необходимо их модульное тестирование. К сожалению, классы не предназначены для модульного тестирования, поэтому мы создаем фиктивные объекты для тестирования кода.
Пример:
class SomeOtherClass
{
public:
void foo2() { … }
};
class ClassToTest
{
public:
ClassToTest() {…}
void foo1() { SomeOtherClass A.foo2(); }
};
В приведенном выше примере мы хотели бы протестировать foo1()
, но для этого нужно foo2()
, поэтому мы хотели бы сделать foo2()
принадлежащим фиктивному объекту (в реальной жизни эти функции/ классы значительно более сложны и включают взаимодействие с аппаратными конфигурациями и т. д., следовательно, потребность в фиктивных объектах / функциях).
До сих пор мы делали что-то подобное, но это на самом деле не оптимально, поскольку кажется, что код оказывает побочные эффекты на другие модульные тесты.
class MockSomeOtherClass
{
public:
foo2() { … } // mock function
};
#define SomeOtherClass MockSomeOtherClass
#include “ClassToTest.cpp”
...
Есть ли лучший способ сделать этобез изменения оригинальных классов (или с минимальными изменениями)?Для тестирования мы используем CPPUnit.
EDIT: добавлен тег winapi для более четкого описания среды.