我是gmock的新手,所以我想知道如何将在被测函数中调用的简单C函数存根以进行单元测试。
示例:
int func(int a)
{
boolean find;
// Some code
find = func_1();
return find;
}我搜索过gmock,在我的理解中,gmock没有提供存根简单的C函数的功能,因此我想问一下gmock是否提供了模拟或存根func_1的功能
如果没有,我如何在不更改源代码的情况下手动在测试代码中存根func_1?我正在使用google测试框架进行单元测试。
谢谢。
发布于 2015-08-28 23:30:01
最近我发现自己也遇到了同样的情况。我必须为用C编写的库编写单元测试,这反过来又依赖于同样用C编写的其他库,所以我想使用gmock模拟所有依赖项的函数调用。让我用一个例子来解释我的方法。
假设要测试的代码(库A)调用另一个库lib_x_function()中的函数
lib_a_function()
{
...
retval = lib_x_function();
...
}因此,我想模拟X库。因此,我在文件lib_x_mock.h中编写了一个接口类和一个模拟类
class LibXInterface {
public:
virtual ~LibXInterface() {}
virtual int lib_x_function() = 0;
}
class LibXMock : public LibXInterface {
public:
virtual ~LibXMock() {}
MOCK_METHOD0(lib_x_function, int());
}另外,我创建了一个源文件(比如lib_x_mock.cc),它为实际的C函数定义了一个存根。这将调用mock方法。注意对模拟对象的extern引用。
#include lib_x.h
#include lib_x_mock.h
extern LibXMock LibXMockObj; /* This is just a declaration! The actual
mock obj must be defined globally in your
test file. */
int lib_x_function()
{
return LibXMockObj.lib_x_function();
}现在,在测试库A的测试文件中,我必须全局定义模拟对象,以便它既可以在测试中访问,也可以从lib_x_mock.cc访问。这是lib_a_tests.cc:
#include lib_x_mock.h
LibXMock LibXMockObj; /* This is now the actual definition of the mock obj */
...
TEST_F(foo, bar)
{
EXPECT_CALL(LibXMockObj, lib_x_function());
...
}这种方法非常适合我,我有几十个测试和几个模拟的库。但是,我对创建全局模拟对象是否可以有一些疑问-我在separate question中提出了这个问题,并仍然在等待答案。除此之外,我对这个解决方案很满意。
更新:有关全局对象的问题可以通过创建对象来轻松解决,例如,在测试夹具的构造函数中创建对象,并将指向该对象的指针存储在全局变量中。
然而,也请注意我对这个问题的另一种回答,我刚刚发布了这个问题。
https://stackoverflow.com/questions/31989040
复制相似问题