繁体   English   中英

从工厂模拟返回多个 unique_ptr

[英]Returning multiple unique_ptr from factory mock

当无法通过对被调用 function 的不同输入参数识别调用时,如何从返回unique_ptr的模拟工厂返回多个 object?

我正在这样做:

EXPECT_CALL(MyFactoryMock, create())
  .WillRepeatedly(Return(ByMove(std::make_unique<MyObjectTypeMock>())));

运行时错误是:

[致命] /.../tools/googletest/1.8.0-57/include/gmock/gmock-actions.h:604:: Condition.performed_ 失败。 ByMove() 动作只能执行一次。

使用WillOnce只做一次同样的事情,效果很好。

ByMove旨在移动您在测试中准备的预定义值,因此只能调用一次。 如果您需要其他内容,则需要自己明确编写。

这是googletest 文档的摘录:

小测验时间! 如果多次执行Return(ByMove(...))动作(例如,您编写... .WillRepeatedly(Return(ByMove(...))); ),您认为会发生什么? 想一想,在第一次动作运行后,源值将被消耗(因为它是一个只移动的值),所以下一次,没有值可以移动——你会得到一个运行时Return(ByMove(...))只能运行一次的错误。

如果您需要模拟方法做的不仅仅是移动预定义的值,请记住,您始终可以使用 lambda 或可调用的 object,它们几乎可以做任何您想做的事情:

 EXPECT_CALL(mock_buzzer_, MakeBuzz("x")).WillRepeatedly([](StringPiece text) { return MakeUnique<Buzz>(AccessLevel::kInternal); }); EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x"));

每次触发此EXPECT_CALL时,都会创建并返回一个新的unique_ptr<Buzz> 你不能用Return(ByMove(...))做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM