如何模拟malloc在GMOCK中返回null?

Dev*_*ove 5 c++ mocking googletest googlemock

我想使用Gmock框架在C++中模拟malloc.可能吗?我已经尝试了所有可能的方法.但是托管这个malloc实现的类有一个私有构造函数和析构函数?

有没有什么方法可以直接模拟malloc返回NULL?

小智 1

开发者爱心,

首先,嘲笑标准库从来都不是一个好的做法,在这样的粒度级别上测试代码是为了艺术而艺术。您必须注意到,从一开始,测试就成为项目的一部分,如果您想让它们保持最新(也称为维护工作回归),您必须以与生产代码相同的方式考虑它们的设计。事实上,测试也是在项目生命周期中必须维护的代码,如果阅读、纠正并最终理解测试将花费太多时间,这样的回归将毫无用处。尝试将其视为“生活文档”。

尽管如此,模拟标准 C 库的最丑陋的方法之一可能是静态钩子和宏。考虑以下示例:

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <boost/bind.hpp>
#include <boost/function.hpp>

static boost::function<void*(size_t)> malloc_bridge;

struct StdlibMock
{
    StdlibMock()
    {
        malloc_bridge = boost::bind(&StdlibMock::mallocMock, this, _1);
    }
    MOCK_METHOD1(mallocMock, void*(size_t));
};  // struct Struct StdlibMock

void* malloc_cheat(size_t size)
{
    return malloc_bridge(size);
}

#define malloc malloc_cheat

struct Sut
{
    void f()
    {
        malloc(10);
    }
};

struct TestWithMalloc : ::testing::Test
{
    StdlibMock stdlibMock;
};  // struct TestWithMalloc

TEST_F(TestWithMalloc, ShouldMalloc10Bytes)
{ 
    EXPECT_CALL(stdlibMock, mallocMock(10))
      .WillOnce(::testing::Return(static_cast<void*>(0)));
    Sut sut;
    sut.f();
}

#undef malloc
Run Code Online (Sandbox Code Playgroud)

请注意,由于使用了预处理器宏,因此您无法将 mallocMock 函数名称替换为简单的 malloc。希望对您有一点帮助。