【问题标题】:MOCK a method that accepts unique_ptr [duplicate]MOCK一个接受unique_ptr的方法[重复]
【发布时间】:2018-08-06 09:06:35
【问题描述】:

我有以下需要模拟的课程:

#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>        ]

如何模拟相关函数?

【问题讨论】:

  • 这个问题不是引用问题的重复。那个是关于在返回类型中使用unique_ptr 而不是作为参数类型,这就是这个问题的情况。

标签: c++ gmock


【解决方案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

还可以查看文档Mocking Methods That Use Move-Only Types 以获取更多示例和更详细的说明。 (看来an earlier cookbook 现在是一个断开的链接。)

A slightly lengthier example can be found in another SO answer 到标记为与此问题重复的问题。 (很难认为标题重复,因为一个标题提到返回值,另一个提到函数参数。但答案中的内容基本相同,涵盖了两种用例:返回类型和函数参数。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-28
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多