使用C++返回一个future

5

我正在使用Google Test,并尝试模拟返回未来对象的方法。我在测试用例中创建了一些未来对象,然后执行 "when(mock.Call()).thenReturn(myFutureObject)",但是出现了错误:"use of deleted function 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;

我猜想我遇到了有关future的复制构造函数被删除的错误,那么我的问题是,如何“模拟”一个future对象,即如何“返回”一个未拷贝的future,并且我尝试使用“std::move”?我在这里漏掉了什么吗?


我们仍然需要一个好的答案来解决这个问题。 - Maf
2个回答

1

自gtest/gmock 1.10.0版本开始,可以使用lambda代替简单的返回操作。因此,请尝试以下操作:

std::promise<MyClass> pr;

EXPECT_CALL(mockSvc, mymethod()).WillOnce([&] 
 { return pr.get_future(); });


0

最终,我成功解决了这个问题:

在期望电话之前,请使用以下方法:

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);

编辑:你也可以在Return中只使用“ByMove”来使用EXPECT_CALL。否则gtest将默认查看被删除的复制构造函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接