2014-02-27 95 views
3

我想要建立一個簡單的嘲笑類GMock不會編譯 - GTEST_EXCLUSIVE_LOCK_REQUIRED似乎

#include "interpolation.hpp" 

#include <gtest/gtest.h> 
#include <gmock/gmock.h> 

class MockInterp1D : public Interp1DBase { 
public: 
    MOCK_METHOD1(evaluateAt, double(double)); 
    MOCK_METHOD2(evaluateAt, double(double, int)); 
}; 

基於使用谷歌嘲笑以下基本類

class Interp1DBase { 
public: 
    virtual double evaluateAt(double) const = 0; 
    virtual double evaluateAt(double, int) const = 0; 
    virtual ~Interp1DBase() { }; 
}; 

不被定義。當我嘗試編譯在使用這種模擬測試,我得到以下錯誤:

In file included from /usr/include/gmock/gmock-generated-function-mockers.h:43:0, 
       from /usr/include/gmock/gmock.h:61, 
       from /home/tlycken/exjobb/Code/alpha-orbit-follower/test/interpolation/interpolation-mocks.hpp:4, 
       from /home/tlycken/exjobb/Code/alpha-orbit-follower/test/physics/B-field-tests.hpp:6, 
       from /home/tlycken/exjobb/Code/alpha-orbit-follower/test/physics/B-field-tests.cpp:2: 
/usr/include/gmock/gmock-spec-builders.h:134:41: error: expected ‘;’ at end of member declaration 
    bool VerifyAndClearExpectationsLocked() 
             ^

然後數以百計類似的語法或定義錯誤都指向文件中GMock。

我看了看gmock-spec-builder.h:134,並發現了下面的(在某些情況下):

// Verifies that all expectations on this mock function have been 
// satisfied. Reports one or more Google Test non-fatal failures 
// and returns false if not. 
bool VerifyAndClearExpectationsLocked() 
    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex); 

這使我相信,GTEST_EXCLUSIVE_LOCK_REQUIRED_可能是由於某種原因沒有定義的宏。事實上,在挖掘從gmock/gmock.hgtest/gtest.h包含的所有頭文件後,我仍未找到該宏的定義。

我在這裏做錯了什麼?


UPDATE:

我已經能夠產生一個更簡單的小例子:

// in file mock-test.cpp 
#include <gmock/gmock.h> 
// Yeah, that's the only content 

編譯

g++ -o mock-test.o -c mock-test.cpp 

導致相同的錯誤。

我已經通過sudo apt-get install google-mock安裝GMock,這給了我一個文件夾下/usr/src在那裏我可以運行cmake .隨後make產生,我複製到/usr/lib庫文件。頭文件已經在/usr/include,所以我沒有手動對它們做任何事情。

回答

6

當我試圖用gtest 1.6編譯gmock 1.7時,我得到了同樣的錯誤。確保你使用的是相同版本的gtest。

+0

原來是這個問題 - 我之前使用過'gtest',然後使用'sudo apt-get install gtest'安裝它,這顯然是在1.6版本中引入的。當我在該項目中加入'gmock'時,它在軟件包回購中不可用,所以我抓住了源代碼1.7版 - 它捆綁了'gtest' 1.7。然而,由於我的搜索路徑('/ usr/include'和'/ usr/lib'下面還有'gtest'頭文件和庫),'gcc'似乎更喜歡從那裏抓取它們,導致這個錯誤。 –

0

我不知道如何在gcc中使用g-mock。 但基本上我們在這樣的窗口中使用。 你的班級定義是正確的。 你有沒有使用這些功能,如

EXPECT_CALL(classobj, exact functionname as it looks in definition).AtLeast(Times(0)).Return(0);

然後

classobj.exact functionname as it looks in definition()

試試這個,我認爲它應該工作。如果你想詳細說明一下,請告訴我,我會用一些典型的例子來擴展它。

+0

感謝對答案!然而,在我嘗試去模擬任何東西之前,這個失敗了 - 請參閱更新,以獲得更簡單的示例,該示例仍會重現該問題。 –

+0

@Tomas Lycken:寫下身體,你爲什麼只寫'#include '? –

+0

@TomasLycken:你配置好'gmock'嗎?我的意思是'庫「和所有。您需要爲您的項目提供gmock和gtest'libs' –

0

在/ usr/src/gmock文件夾中有合適的源頭&。

你的工作只覆蓋文件夾的全部內容:

 
/usr/src/gmock/gtest/src -> /usr/src/gtest/src 
/usr/src/gmock/gtest/cmake -> /usr/src/gtest/cmake 
/usr/src/gmock/gtest/CMakeLists.txt-> /usr/src/gtest/CMakeLists.txt 

/usr/src/gmock/gtest/include/gtest -> /usr/include/gtest/