通常在团队开发过程中,业务逻辑会有上下游依赖,你所负责的部分可能会依赖其他团队成员提供的接口功能,在其他成员还没有提供可用的接口之前,你的开发工作可能会因为缺乏必要接口被阻塞,此时需要对这些尚未实现的接口进行模拟(Mock),以便你本地的工作能够正常推进。
一个典型的Gmock用法如博文:Gtest/Gmock探究(三)-- MOCK_METHODX系列宏分析_mock method-CSDN博客所示,首先创建一个抽象接口类,然后派生一个子类Mock该接口类的的纯虚接口,最后开始基于该子类进行单元测试。除此之外,还可以用googletest提供的预置模板类NiceMock<T>进行特定接口mock,而不必为所有的接口做Mock实现。比如,只想mock一下读取数据的函数,可以不用继承那个抽象接口类,直接进行Mock:
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <string>
using namespace std;
class Mock_OpenFile_Operator
{
public:
MOCK_METHOD1(ReadRawData, std::string& (const char*));
};
class FileDataLoad
{
public:
FileDataLoad() = default;
template <class T>//等到你同事提供了真接口实现时,将此处模板去掉,改用真接口类即可
void FileDataRead(testing::NiceMock<T>* Op, const char* path)
{
string& data = Op->ReadRawData(path);
std::cout << "file content: " << data << std::endl;
}
};
int main(int argc, char* argv[])
{
testing::NiceMock<Mock_OpenFile_Operator> FileReader;
string content = "test data.";
EXPECT_CALL(FileReader, ReadRawData(::testing::_))
.WillOnce(testing::ReturnRef(content));
FileDataLoad loader;
loader.FileDataRead(&FileReader, "dummmpy/path/to/file");
return 0;
}