2012-01-20 8 views
10

Я только начал работать на модульного тестирования (с использованием фреймворка BOOST для тестирования, но издевается я должен использовать Google Mock) и меня такая ситуация:Google Mock модульного тестирования статические методы C++

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);} 
}; 

Итак, я нужно создать mock класс A и сделать мой класс B не использовать настоящий Method1 из класса A, а использовать mock.

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

+0

Я не знаком с gmock, но не могли бы вы просто ссылку '' B.o' и mockA.o'? – Beta

+0

Насколько я знаю, существует несколько способов решения статических методов. Я мог бы, вероятно, решить это, сделав Method1 виртуальным и добавить конструктор в класс B, поэтому он выглядит примерно как B (A & a): a_in_class_b (a) {}, а затем вызов метода 1 будет выглядеть так: a_in_class_b -> Method1(); Но я хочу посмотреть, есть ли другой способ. – Jonhtra

ответ

14

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

Спасибо, это был ответ, который я искал :) – Jonhtra

+0

@ user1160721 должна быть кнопка «принять ответ» слева, если этот ответ тот, который вы ищете;) –

+0

О да, я вижу это сейчас , Я нажму на него, я здесь новый. Я вижу, что есть определенный рейтинг для каждого пользователя, и этот «принять ответ» увеличивает этот рейтинг :) У меня есть еще один подобный вопрос, связанный с этим. Опубликовать новый или задать в комментарии? :) – Jonhtra

Смежные вопросы