c - 使用 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 风格的函数。
解决方案
extern UniMock mockobj;
“uni_mock.cc”中测试库的全局变量是测试用例中的对象uni_mock mock_obj;
(来自重新键入而不是复制粘贴的错字?)的另一个变量TEST_F(Foo, Bar)
。
您可能想查看我对类似问题的回答,以查看一个可行的示例。
推荐阅读
- python - Python 类型错误:可视化只需要 1 个参数,给定 53
- javascript - 一旦抛出异常,try-catch 语句就中断 try-block
- postgresql-10 - 如何为我的 PostgreSQL10 安装 pgAudit?
- dask - 将 Dask/XArray 写入 NetCDF - 并行 IO
- processing - 绘制新线时如何删除旧线?
- python-3.x - Python 看门狗 - 不正确的事件 (Visual Studio 2017)
- java - 休眠 6:什么是 SQM?
- python - 根据头信息拆分fasta文件
- azure - 如何使用 powershell 获取 azure blob 指标(经典)
- python - 从不同的python解释器启动新的python解释器