2012-01-20 88 views
10

我刚开始在单元测试工作(使用测试BOOST框架,但嘲笑我必须使用谷歌模拟),我有这样的情况:谷歌模拟单元测试的静态方法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);} 
}; 

所以,我需要创建模拟类A,并让我的类B不使用A类中的真实Method1,而是使用模拟。

我不知道如何做到这一点,我找不到一些类似的例子。

+0

我不熟悉gmock,但不能你只是链接'B.o'和'mockA.o'? – Beta

+0

据我所知,处理静态方法有一些不同的方法。 我可以解决这个问题,将Method1设置为虚拟的,并在类B中添加构造函数,因此它看起来像B(A和a):a_in_class_b(a){},然后调用Method1将如下所示:a_in_class_b - >方法1(); 但我想看看是否有其他方法。 – 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,在B类中创建一个函子对象(也许是std :: function类型),然后在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

O耶,我现在可以看到它,我会点击它,我是新来的。我可以看到每个用户都有一些评价,这个“接受答案”提高了这个评分:) 我还有一个类似的问题与此相关。发布一个新的,或在评论中提问? :) – Jonhtra