Модульное тестирование Google Mock c ++ - PullRequest
14 голосов
/ 20 января 2012

Я только начал работать над модульным тестированием (для тестирования использую инфраструктуру 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);}
};

Итак, мне нужно создать класс mockA, и чтобы мой класс B не использовал реальный Method1 из класса A, а использовал mock.

Я не уверен, как это сделать, и я не смог найти какой-то подобный пример.

1 Ответ

18 голосов
/ 20 января 2012

Вы можете изменить класс 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);};
...