GMock - 如何刷新模拟返回值

GMock - how to refresh mock return values?

本文关键字:刷新 模拟 返回值 何刷新 GMock      更新时间:2023-10-16

我有一个这样的测试:

#include <gmock/gmock.h>
using namespace ::testing;
class IMyInterface
{
public:
    virtual ~IMyInterface() = default;
    virtual void* DoAllocate(size_t size) = 0;
};
class MockMyInterface : public IMyInterface
{
public:
    MOCK_METHOD1(DoAllocate, void*(size_t));
};
class InterfaceUser
{
public:
    void DoIt(IMyInterface& iface)
    {
        void* ptr = iface.DoAllocate(1024);
        free(ptr);
        ptr = iface.DoAllocate(1024);
        free(ptr);
    }
};
TEST(MyTest, AllocateMock)
{
    MockMyInterface mockIFace;
    EXPECT_CALL(mockIFace, DoAllocate(1024)).WillRepeatedly(Return(malloc(1024)));
    InterfaceUser user;
    user.DoIt(mockIFace);
}
int main(int numArgs, char** args)
{
    ::testing::InitGoogleMock(&numArgs, args);
    return RUN_ALL_TESTS();
}

这将崩溃,因为正在测试的"真实"代码调用DoAllocate两次1024。但gmock似乎只做:

Return(malloc(1024))

一次,即使它叫了两次。显然这是一个问题,因为这意味着 malloc 被调用一次 1024,然后"真实"代码两次释放同一个指针。

如何强制 gmock 在每个模拟调用上实际执行malloc(1024)

通过预先分配缓冲区来设置您的期望,如下所示:

void *buffer1 = malloc(1024);
void *buffer2 = malloc(1024);
EXPECT_CALL(mockIFace, DoAllocate(1024)).Times(2)
    .WillOnce(Return(buffer1))
    .WillOnce(Return(buffer2));