MOCK一个接受unique_ptr的方法

MOCK a method that accepts unique_ptr

本文关键字:unique ptr 方法 一个 MOCK      更新时间:2023-10-16

我有以下需要模拟的类:

#include <gmock/gmock.h>
#include <gtest/gtest.h>
class Callback
{
public:
Callback(): calls(0)
{}
void mcallback(std::unique_ptr<int> rpely)
{
calls++;
}
uint32_t calls;
};
class MockCallBack : public Callback
{
public:
MOCK_METHOD1(mcallback, void(std::unique_ptr<int>));
};

我得到以下错误:

error C2280: 'std::unique_ptr<int,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
1>        with
1>        [
1>            _Ty=int
1>        ]

我该如何嘲笑相关函数?

您需要执行某种技巧,因为std::unique_ptr是仅移动类:

class MockCallBack : public Callback
{
public:
MOCK_METHOD1(mcallbackMock, void(int*));
void mcallback(std::unique_ptr<int> rpely)
{
mcallbackMock(rpely.get())
}
};

然后你可以这样使用它:

MockCallBack mockObject;
auto intPtr = std::make_unique<int>(3)
EXPECT_CALL(mockObject, mcallbackMock(NotNull())); //can use .Times(1) and other things as regular except call
mockObject.mcallback(intPtr); //will trigger except call above

还可以查看文档"使用仅移动类型的模拟方法",以获得更多示例和更详细的解释。(似乎早期的食谱现在已经断了一个环节。(

一个稍长的例子可以在另一个SO对一个被标记为重复的问题的回答中找到。(很难认为标题是重复的,因为一个标题提到了返回值,另一个提到了函数参数。但答案中的内容基本相同,涵盖了两种用例:返回类型和函数参数。(