Код: Выделить всё
class IEaterOfCake
{
public:
virtual void EatCake() = 0;
};
class CakeMaker
{
public:
CakeMaker(IEaterOfCake & e) : mCakeEater(e) {}
void MakeCake() { mCakeEater.EatCake(); }
protected:
IEaterOfCake & mCakeEater;
};
class HungryMan : public IEaterOfCake
{
public:
HungryMan() : mCakeMaker(*this) {}
void HaveLunch() { mCakeMaker.MakeCake(); }
virtual void EatCake() override {/* mmmm cake */};
private:
CakeMaker mCakeMaker;
};
int main()
{
HungryMan m;
m.HaveLunch();
}
Код: Выделить всё
TEST(sometest)
{
class TestEater : public IEaterOfCake
{
virtual void EatCake() override {/* test cake is yummy */};
} t;
CakeMaker cm(t);
cm.MakeCake();
}
Внедрение зависимостей в CakeMaker (или интерфейс к нему) было бы идеальным, но мы надеялись спрятать их внутри класса HungryMan. И я не уверен, как гарантировать, что ссылки на зависимости будут инициализированы при создании, поскольку эти зависимости также должны ссылаться на Hungry man. Обратите внимание, что в этом проекте нельзя использовать слово «new», динамическое размещение не разрешено.
Мне нужны предложения о том, как лучше структурировать этот проект, чтобы HungyMan можно было протестировать с помощью макета. /тестовая реализация. Сейчас я условно компилирую для mCakeMaker другой тип (MockCakeMaker). Но у меня все еще есть проблема, когда mCakeMaker является частным и недоступным для тестирования.
Надеюсь, я объяснил, хорошо, я немного потрудился!
Подробнее здесь: https://stackoverflow.com/questions/788 ... t-possible
Мобильная версия