2015-07-22 88 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(); 
}