簡體   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