2012-01-21 118 views
0

我剛開始在單元測試工作(使用測試BOOST框架,但嘲笑我必須使用谷歌模擬),我有這樣的情況:谷歌模擬單元測試

class A 
{ 
    A(){} 
    virtual int Method1(int a, int b){return a+b;} 
}; 

class B 
{ 
    static int Method2(int a, int b){ return A().Method1(a,b);} 
}; 

是否有可能做測試的類B,這樣使用嘲弄的Method1而不是真實的方法,但不能改變類B? 我知道這會很容易:

class B 
{ 
    B(A *a):a_in_b(a){} 
    static int Method2(int a, int b){return a_in_b->Mehod1();} 
    A *a_in_b; 
}; 
+0

無法讀取gmock食譜,而不b變更 –

回答

0

你可以按照上http://code.google.com/p/googlemock/wiki/ForDummies先導,以建立你的模擬:

#include <gmock/gmock.h> 
class MockA : public A 
{ 
public: 
    MOCK_METHOD2(Method1, int(int a, int b)); 
}; 

調用方法二B類確保B之前知道的模擬A(分配在b,其中A的Mockobject可變)並執行EXPECT_CALL:

MockA mock; 
EXPECT_CALL(mock, Method1(_, _) 
    .WillRepeatedly(Return(a + b); 

確保變量a和b中的exe是有效測試的背景。

+0

我認爲這是答案我在我的問題中描述爲我知道這是可能的,而這個解決方案意味着改變類B(我將不得不在我的類B中添加變量A * a_in_b)。我同意VJovic的觀點,我認爲不改變B類就不可能做嘲弄。我認爲gmock是一些特殊的東西,一些神奇的東西,但它只是簡單的多態性:) – Jonhtra

1

,你可以先改變你的Class A成一個Singleton,就像:

class A 
{ 
    A* Instance(); 
    virtual int Method1(int a, int b){return a+b;} 
    static A* A_instance; 
    A(){} 
}; 
A::A_instance = NULL; 

,然後嘲笑Class A

#include <gmock/gmock.h> 
class MockA : public A 
{ 
    public: 
     MOCK_METHOD2(Method1, int(int a, int b)); 
}; 

和後更改A().A::Instance()->;然後,你可以用下面的方法來讓Class B調用運行時的模擬方法:

MockA mock; 
A::A_instance = &mock; 
EXPECT_CALL(mock, Method(_, _)) 
......(you can decide the times and return values of the mock method) 

獲取更多信息,您可以在 http://code.google.com/p/googlemock/wiki/CookBook

+0

Gmock烹飪書的哪一部分你找到了一個部分單身人士? – JC203