Статические методы модульного тестирования Google Mock С++

Я только начал работать над модульным тестированием (используя платформу 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 не использовал настоящий метод Method1 из класса A, а использовал фиктивный.

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


person Jonhtra    schedule 20.01.2012    source источник
comment
Я не знаком с gmock, но не могли бы вы просто связать B.o и mockA.o?   -  person Beta    schedule 20.01.2012
comment
Насколько я знаю, есть другой способ работы со статическими методами. Вероятно, я мог бы решить эту проблему, сделав Method1 виртуальным и добавив конструктор в класс B, чтобы он выглядел примерно так: B(A &a):a_in_class_b(a){}, а затем вызов Method1 выглядел бы так: a_in_class_b- ›Метод1(); Но я хочу посмотреть, есть ли другой путь.   -  person Jonhtra    schedule 20.01.2012


Ответы (1)


Вы можете изменить класс 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);};
person BЈовић    schedule 20.01.2012
comment
Спасибо, это был ответ, который я искал :) - person Jonhtra; 21.01.2012
comment
@user1160721 user1160721 слева должна быть кнопка «принять ответ», если это тот ответ, который вы ищете;) - person BЈовић; 21.01.2012
comment
О да, теперь я вижу это, я нажму, я здесь новенький. Я вижу, что у каждого пользователя есть рейтинг, и этот ответ увеличивает этот рейтинг :) У меня есть еще один похожий вопрос, связанный с этим. Выложить новый или спросить в комментарии? :) - person Jonhtra; 21.01.2012
comment
Я разместил новый вопрос, поэтому, когда вы поймаете время, посмотрите :) - person Jonhtra; 21.01.2012