【问题标题】:C++ returning a futureC++ 返回一个未来
【发布时间】:2021-05-04 08:29:17
【问题描述】:

我正在使用谷歌测试并试图模拟一个返回未来的方法。我正在做的是在测试用例中创建一些未来对象,然后我执行“when(mock.Call()).thenReturn(myFutureObject),但我得到一个错误”使用已删除的函数 std::future<_res> ::future(const std::future<_res>&)"。

这是代码:

std::promise<MyClass> pr;
std::future<MyClass> fut { pr.get_future() };

std::cout << fut.valid() << std::endl; // this returns 1 so it seems I have a valid future object

EXPECT_CALL(mockSvc, mymethod()).WillOnce(Return(std::move(fut)));

// this "expected call" throws an error "use of deleted function std::future<_res>::future(const std::future<_Res>&)
// /usr/include/c++/7/future:782:7: note declared here
//    future(const future&) = delete;

我想我收到了关于删除未来的复制构造函数的错误,所以我的问题是,我如何“模拟”未来对象,即如何在不复制的情况下“返回”未来,我做到了尝试使用“std::move”?我在这里错过了什么?

【问题讨论】:

    标签: c++ unit-testing promise mocking future


    【解决方案1】:

    从 gtest/gmock 1.10.0 开始 - 可以使用 lambdas 而不是简单的 Return 操作。所以试试这个:

    std::promise<MyClass> pr;
    
    EXPECT_CALL(mockSvc, mymethod()).WillOnce([&] 
     { return pr.get_future(); });
    
    

    【讨论】:

      【解决方案2】:

      终于解决了:

      在等待电话之前,请使用以下内容:

      ON_CALL(mockSvc, myMethod()).WillByDefault(Return(ByMove(pr.get_future)));
      
      // after that verify the expected call, in order to avoid uninteresting mock call warning.
      
      EXPECT_CALL(mockSvc, myMethod()).Times(1);
      

      编辑:您也可以在返回中仅使用 EXPECT_CALL 和“ByMove”。否则 gtest 将默认查看复制构造函数,当然,该构造函数已被删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        • 2017-10-03
        • 2016-09-18
        • 2020-11-14
        • 1970-01-01
        • 2020-05-17
        相关资源
        最近更新 更多