あなたはテンプレートにクラス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
を初期化します。
もう1つの方法は、直接A::Method1
を呼び出し、クラスBでファンクタオブジェクト(多分std :: function type)を作成し、Method2でそれを呼び出すことです。 MockCalc :: Method1へのコールバックをこのオブジェクトに作成するため、MockAは必要ないため、より簡単です。このような何か:
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);};
私はgmockに慣れていないんだけど、あなただけの 'B.o'と' mockA.o'はリンクできませんでしたか? – Beta
私が知る限り、静的メソッドを扱う方法はいくつかあります。 Method1を仮想にしてクラスBにコンストラクタを追加すると、これはB(A&a):a_in_class_b(a){}のようになり、Method1の呼び出しは次のようになります:a_in_class_b - > Method1(); しかし、別の方法があるかどうか確認したい。 – Jonhtra