Я хочу подделать (то есть обменяться с тестовой реализацией) класс следующим образом:
class Foo {
public:
...
template <typename T> void Bar(T& baz);
...
}
В настоящее время я достигаю этого, создав несвязанный класс с тем же интерфейсом:
class FakeFoo {
public:
...
template <typename T> void Bar(T& baz);
...
}
И поменять местами класс, используемый в кодовой базе, с помощью макроса:
#ifdef USE_FAKE_FOO
using ClientFoo = FakeFoo;
#else
using ClientFoo = Foo;
#endif
Проблемы, связанные с этим, заключаются в том, что мне необходимо перекомпилировать кодовую базу в зависимости от того, хочу ли я запускать тесты.Еще хуже, когда у меня есть несколько FakeFoo
s, которые реализуют разные функциональные возможности для разных тестов, я должен заново скомпилировать кодовую базу для каждого конкретного FakeFoo
, который я хочу использовать.
Есть ли какой-либо способ, которым я могуобойти это?
ПРИМЕЧАНИЕ: шаблонирование кода, использующего Foo, работает, но я не хочу требовать, чтобы весь клиентский код делал это только для того, чтобы тесты можно было легко запускать.