web-dev-qa-db-ja.com

静的メソッドc ++をテストするGoogleMockユニット

ユニットテストの作業を始めたばかりです(テストには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を使用せずに、モックを使用するようにする必要があります。

これを行う方法がわかりません。同様の例を見つけることができませんでした。

15
Jonhtra

クラス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);};
18
BЈовић