2012-01-20 120 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