Вы можете изменить класс B на шаблон:
template< typename T >
class B
{
public:
static int Method2(int a, int b){ return T::Method1(a,b);}
};
, а затем создать макет:
struct MockA
{
static MockCalc *mock;
static int Method2(int a, int b){ return mock->Method1(a,b);}
};
class MockCalc {
public:
MOCK_METHOD2(Method1, int(int,int));
};
Перед каждым тестом инициализировать объект статического макета MockA::mock
.
Другой вариант - вместо этого вызвать напрямую A::Method1
, создать объект функтора (возможно, тип std :: function) в классе B и вызвать его в Method2.Тогда это проще, потому что вам не понадобится MockA, потому что вы создадите обратный вызов MockCalc :: Method1 для этого объекта.Примерно так:
class B
{
public:
static std::function< int(int,int) > f;
static int Method2(int a, int b){ return f(a,b);}
};
class MockCalc {
public:
MOCK_METHOD2(Method1, int(int,int));
};
и для его инициализации:
MockCalc mock;
B::f = [&mock](int a,int b){return mock.Method1(a,b);};