【问题标题】:Workaround for gmock to support rvalue referencegmock 支持右值引用的解决方法
【发布时间】:2012-08-23 09:22:45
【问题描述】:

gmock 不支持将右值引用作为模拟函数的参数 (issue report)。

例如以下代码将无法编译:

MOCK_METHOD1(foo,void(std::string&&));

我找不到有关 gmock 何时会为此添加支持的信息。

【问题讨论】:

    标签: c++ gmock


    【解决方案1】:

    我想出了一个解决方法:使用非模拟函数 foo(std::string&& s){foo_rvr(s)} 将函数中继到模拟函数 foo_rvr(std::string)。这是完整的程序。

    #include <string>
    #include <gtest/gtest.h>
    #include <gmock/gmock.h>
    
    class RvalueRef
    {
    public:
        virtual void foo(const std::string&)=0;
        virtual void foo(std::string&&)=0;
    };
    
    class MockRvalueRef : public RvalueRef
    {
    public:
        void foo(std::string&& s){foo_rvr(s);}
        MOCK_METHOD1(foo,void(const std::string&));
        MOCK_METHOD1(foo_rvr,void(std::string));
    };
    
    TEST(RvalueRef, foo)
    {
        MockRvalueRef r;
        {
            ::testing::InSequence sequence;
            EXPECT_CALL(r,foo("hello"));
            EXPECT_CALL(r,foo_rvr("hi"));
        }
    
        std::string hello("hello");
        r.foo(hello);
        r.foo("hi");    
    }
    
    int main(int argc, char* argv[])
    {
        ::testing::InitGoogleMock(&argc,argv);
    
        int rc=RUN_ALL_TESTS();
    
        getchar();
        return rc;
    }
    

    【讨论】:

    • 可以在此处找到此解决方法的另一个变体:stackoverflow.com/questions/7616475/…
    • 谢谢你,g-makulik,看了那篇文章后,我想我们使用的是相同的技术——使用代理绕过gmock的限制。
    • 是的,这与代理呼叫的技术完全相同。不过,在将这种解决方法与智能指针一起使用时,请记住我的内存管理约束。
    猜你喜欢
    • 2022-07-27
    • 2013-01-11
    • 2020-10-02
    • 2015-08-12
    • 1970-01-01
    • 2023-02-20
    • 2011-02-10
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多