2015-07-22 133 views
0

我正在嘗試使用gmock進行我的第一次谷歌測試,準備好所有VS環境。簡單的使用gtest ASSERT_XX函數就可以工作。但是當試圖使用gmock時,我遇到了第一個編譯問題。我想也許我的程序有一些問題,但gtest並沒有告訴我如何解決它。Google測試:EXPECT_CALL無法在我的測試代碼中編譯

在下面的程序中,我得到了一個名爲「FileIo」的類。它的「讀取」函數將執行I/O操作,我希望在保持f()和g()不變的情況下模擬此Read()函數。所以我使用NickMock建立FileIo的模擬對象,然後嘗試使用EXPECT_CALL僞裝Read()函數。

class FileIo 
{ 
public: 
    int f(){ return 1; } 
    int g(int i){ return i*i; } 
    int Read(){ 
     FILE* pf = fopen("D:\\a.txt", "r+w"); 
     fclose(pf); 
     return 3; 
    } 
}; 

class BBTest : public ::testing::Test 
{ 
public: 

}; 
TEST_F(BBTest, testcase_1) 
{ 
    NiceMock<FileIo> mio; 
    EXPECT_CALL(mio, Read()).WillRepeatedly(DoAll(Return(2))); 
} 

EXPECT_CALL聲明失敗編譯。如何解決它? 謝謝。

+0

看到您收到的實際編譯器錯誤會很有幫助。 – Ian

+1

您需要爲FileIo定義一個Mock類。就像你上面所做的那樣,你不能把它包裝在一個NiceMock中。請參閱https://code.google.com/p/googlemock/wiki/ForDummies#Getting_Started –

回答

0

以下是您發佈內容的一個非常簡單的示例。我不會以最簡單的形式解釋。有很多可以學習的例子。 Google是你最好的朋友。搜索,閱讀和學習。

class IFileIo 
{ 
public: 
    virtual int Read() = 0; 
}; 

class FileIo : IFileIo 
{ 
public: 
    int Read() { 
     FILE* pf = fopen("D:\\a.txt", "r+w"); 
     fclose(pf); 
     return 3; 
    } 
}; 

class MyClass 
{ 
public: 
    void ReadFile() 
    { 
     _file->Read(); 
    } 
    IFileIo* _file; 
}; 

class NiceMock : public IFileIo 
{ 
public: 
    MOCK_METHOD0(Read, int()); 
}; 


class BBTest : public ::testing::Test 
{ 
public: 
    NiceMock _mio; 
}; 

TEST_F(BBTest, testcase_1) 
{ 
    EXPECT_CALL(_mio, Read()).WillOnce(Return(2)); 
    MyClass mc; 
    mc._file = &_mio; 
    mc.ReadFile(); 
}