23

単体テストに取り組み始めたばかりです(テストには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 を使用するのではなく、モックを使用するようにする必要があります。

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

4

3 に答える 3

31

クラス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);};
于 2012-01-20T16:15:53.373 に答える