2011-05-07 68 views
4

讓我們有這樣的例子:如何谷歌模擬一個從結構調用方法

Class A{ 
     public: 
      int Get(); 
    } 

在另一個文件中:

A a; 
struct B{ 
    int res = a.Get(); 
} 

我需要谷歌模擬獲取方法,但是,我也將需要打電話給真正的人。我試過用#ifdef,它似乎工作。然後我決定在#ifdef部分嘲笑它,但它什麼都不做。

#ifdef UNIT_TEST 
MOCK_METHOD0(A,Get); 
#else 
int A::Get(){....} 
#endif 

我在做什麼錯?有沒有更乾淨的方法來做到這一點?請任何幫助,將不勝感激。

+0

你已經發布的代碼是不是C++。 – 2011-05-07 14:25:20

+0

http://stackoverflow.com/questions/5921238/how-to-google-mock-a-method-called-from-a-struct的幾乎確切欺騙發表相同的用戶。 – 2011-05-07 14:26:22

+0

@unapersson關當然,這是C++ – 2011-05-07 16:17:16

回答

-1

頭文件

class A{ 
    public: 
     int Get(); 
}; 
A a; 

源文件:

int A::Get(){ 
    .... 
} 

struct B{ 
    return res = a.Get(); 
}; 
+0

這就是現在的樣子。儘管我無法改變很多代碼 – Manolete 2011-05-09 08:37:15

2

你們這樣做是錯誤的。這是怎麼了應該做的事:

1)頭文件:

struct A 
    { 
    #ifdef UNIT_TEST 
     MOCK_METHOD0(Get, int()); 
    #else 
     int Get(); 
    #endif 
    }; 

2)源文件:

#ifndef UNIT_TEST 
int A::Get() 
{ 
    // ... 
} 
#endif 
+0

當然,它是C++,我只是簡單。 @VJo INT的get(){}已經因爲它使用許多其他結構(FSM)的結構之外定義的,所以我不能在結構中重新定義它... – Manolete 2011-05-07 17:00:50

+0

很抱歉的拼寫錯誤的單詞,但這些想法是爲了顯示C++代碼。 – Manolete 2011-05-07 17:06:01

+0

@Manuel好的,修正了這個例子 – 2011-05-08 07:41:02

1

Google Mock似乎已經發生了很大的變化。現在您可以嘗試在食譜中描述的delegating to a real object。你可以繼續設置和檢查你的模擬預期,但電話也將由真實的事情來處理。

class MockA : public A 
{ 
public: 
    MockA() 
    { 
     ON_CALL(*this, Get()).WillByDefault(Invoke(&real, &A::Get)); 
    } 
    MOCK_METHOD0(Get, int()); 

private: 
    A real; 
}; 
相關問題