ユニットテストの作業を始めたばかりです(テストにはBOOSTフレームワークを使用していますが、モックの場合はGoogle Mockを使用する必要があります)。
class A
{
static int Method1(int a, int b){return a+b;}
};
class B
{
static int Method2(int a, int b){ return A::Method1(a,b);}
};
したがって、モッククラスAを作成し、クラスBをAクラスの実際のMethod1を使用せずに、モックを使用するようにする必要があります。
これを行う方法がわかりません。同様の例を見つけることができませんでした。
クラス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
を呼び出し、クラス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);};