[英]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.