Ваши Foo
и Bar
передаются конструктору по ссылке.Есть два подхода к этому.
Моя личная польза - использовать интерфейс и использовать полиморфные объекты.
Так это выглядит так:
class IFoo {
public:
virtual void someFunction() = 0;
};
class IBar {
public:
virtual void otherFunction() = 0;
};
class Foo : public IFoo {
....
void someFunction() {
}
};
class Bar : public IBar {
.....
void otherFunction() {
}
};
class TestMe {
public:
TestMe(IFoo& aFoo, IBar& aBar);
~TestMe();
float FooBar();
};
// test code (GMock example):
class MockFoo : public IFoo {
MOCK_METHOD(someFunction(), void());
};
class MockBar : public IBar {
MOCK_METHOD(otherFunction(), void());
};
TEST(TestMeTest, someTest)
{
MockBar bar;
MockFoo foo;
TestMe testMe(bar, foo);
EXPECT_CALL(bar, otherFunction());
EXPECT_EQ(0.2, testMe.FooBar());
}
Это в основном то же самоевещь, как использование шаблонов.В этом случае используется динамический полиморфизм.В случае с шаблоном у вас есть нечто похожее, поэтому некоторые люди называют это статическим полиморфизмом.
Оба подхода имеют свои плюсы и минусы, и вы сами выбираете, какой из них лучше в вашем случае.