首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google Mock可以使用智能指针返回类型的方法吗?

Google Mock可以使用智能指针返回类型的方法吗?
EN

Stack Overflow用户
提问于 2011-10-01 05:54:08
回答 5查看 28.5K关注 0票数 51

我有一个返回智能指针的工厂。无论我使用哪种智能指针,我都不能让Google Mock模拟工厂方法。

mock对象是纯抽象接口的实现,其中所有方法都是虚拟的。我有一个原型:

代码语言:javascript
运行
复制
MOCK_METHOD0(Create, std::unique_ptr<IMyObjectThing>());

我得到了:

代码语言:javascript
运行
复制
"...gmock/gmock-spec-builders.h(1314): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'"

定义了智能指针中指向的类型。

我知道它试图访问一个声明为private的构造函数,但我不明白为什么。当这是一个std::auto_ptr时,错误告诉我没有复制构造函数,这让我很困惑。

不管怎么说,有没有办法锁定一个返回智能指针的方法呢?或者,有没有更好的方法来建工厂?我唯一的决心是返回一个原始指针(blech...)吗?

我的环境是Visual Studio 2010旗舰版和Windows 7。我没有使用CLI。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-02 00:33:28

大多数情况下,Google Mock要求模拟方法的参数和返回值是可复制的。根据boost's documentation,unique_ptr是不可复制的。您可以选择返回一个使用共享所有权的智能指针类(shared_ptr、linked_ptr等)。因此是可复制的。或者,您可以使用原始指针。由于所讨论的方法显然是构造对象的方法,因此我认为返回原始指针没有固有的问题。只要将结果赋给每个调用点的某个共享指针,就不会有问题。

票数 -6
EN

Stack Overflow用户

发布于 2012-07-19 02:41:48

对于google mock框架的不可复制函数参数和返回值的问题,一个可行的解决方法是使用代理mock方法。

假设你有以下接口定义(如果以这种方式使用std::unique_ptr是一种好的风格,这似乎是一个或多或少的哲学问题,我个人喜欢它来强制所有权转移):

代码语言:javascript
运行
复制
class IFooInterface {
public:
    virtual void nonCopyableParam(std::unique_ptr<IMyObjectThing> uPtr) = 0;
    virtual std::unique_ptr<IMyObjectThing> nonCopyableReturn() = 0;
    virtual ~IFooInterface() {}
};

适当的模拟类可以这样定义:

代码语言:javascript
运行
复制
class FooInterfaceMock
: public IFooInterface {
public:
    FooInterfaceMock() {}
    virtual ~FooInterfaceMock() {}

    virtual void nonCopyableParam(std::unique_ptr<IMyObjectThing> uPtr) {
        nonCopyableParamProxy(uPtr.get());
    }
    virtual std::unique_ptr<IMyObjectThing> nonCopyableReturn() {
        return std::unique_ptr<IMyObjectThing>(nonCopyableReturnProxy());
    }


    MOCK_METHOD1(nonCopyableParamProxy,void (IMyObjectThing*));
    MOCK_METHOD0(nonCopyableReturnProxy,IMyObjectThing* ());
};

您只需小心,nonCopyableReturnProxy()方法的配置(采取的操作)将返回NULL或在堆上动态分配的实例。

有一个google-mock user forum thread讨论了这个话题,其中一位维护者表示,google-mock框架未来不会改变以支持这一点,他们的政策强烈反对使用std::auto_ptr参数。如上所述,这是一个哲学观点,模拟框架的功能不应该控制你想要设计的接口类型,或者你可以从第三方API中使用的接口。

如上所述,答案描述了一种可行的解决方法。

票数 101
EN

Stack Overflow用户

发布于 2019-02-01 01:01:29

我知道这篇文章来自很久以前,所以你现在可能已经找到了答案。

gmock之前不支持返回任何可移动类型的mock函数,包括智能指针。然而,在2017年4月,gmock引入了一个新的操作修饰符ByMove

EXPECT_CALL(*foo_, Bar(_, )).WillOnce(Return(ByMove(some_move_only_object)));

例如,some_move_only_object可以是std::unique_ptr.

所以,是的,现在gmock可以模拟一个接受智能指针的函数。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7616475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档