首页 > 解决方案 > 使用 gmock 模拟 c 风格的函数

问题描述

我有一些 C++ 代码,我在其中从 unistd.h 调用一些 C 函数,例如 (open, close, read, write) 等。我试图模拟这些函数调用,因为我不想在运行时调用实际的实现测试。

我做了以下事情:

创建了一个接口:

class InterfaceUnistd
{
    public:
        InterfaceUnistd() {};
        virtual ~InterfaceUnistd() = default;
        virtual int open(const char*, int) = 0;
};

创建了一个模拟:

class UniMock : public InterfaceUnistd
{
    public:
        UniMock() {};
        virtual ~UniMock() {};
        MOCK_METHOD(int, open, (const char*, int), (override));
};

创建了一个 uni_mock.cc 文件,其中包含:

#include "uni_mock.hpp"

extern UniMock mockobj;
int open(const char *path, int flags) { return mockobj.open(path, flags); }

我将其编译为共享库 -luni-mock.so。

在我的测试文件中,我有:

#include "uni_mock.hpp"
#include "somelib.hpp"

class Foo_Fixture : public ::testing
{
};

TEST_F(Foo, Bar)
{
    uni_mock mock_obj;
    EXPECT_CALL(mock_obj, open("test", _))
        .Times(1)
        .WillOnce(Return(2));

    Fruit apple;
    int ret = apple.init("test"); // init calls open //  
}

当我运行测试时,我收到以下错误:

status = -1
unittest_sensor_core.cc:230: Failure
Actual function call count doesn't match EXPECT_CALL(mock_obj, open("test", _))...
         Expected: to be called once
           Actual: never called - unsatisfied and active
[  FAILED  ] sensor_core_test_support.GW_start_comm (0 ms)

如果我将 mock_obj 移动到全局范围内,上面的错误就会消失,但仍然没有调用 mock open 方法。

我按照这里提到的过程来模拟 c 风格的函数。

标签: cgoogletestgmock

解决方案


extern UniMock mockobj;“uni_mock.cc”中测试库的全局变量是测试用例中的对象uni_mock mock_obj;(来自重新键入而不是复制粘贴的错字?)的另一个变量TEST_F(Foo, Bar)

您可能想查看我对类似问题的回答,以查看一个可行的示例。


推荐阅读