2017-10-12 68 views
3

我是gmock的新手,我想了解使用SaveArg時發生的情況。C++ gmock - 將空指針傳遞給SaveArg時會發生什麼

這是我在gmock實況發現:

SaveArg<N>(pointer):保存了N次(從0開始)參數*指針。

這是否意味着:

  1. 使「指針」點到N個參數,或

  2. 分配N個參數,以任何的「指針」指向的值?

我在考慮以下情況:

class MockClass : public BaseClass { public: MOCK_METHOD1(somefunc,void(SomeType&)); };

然後在我的測試功能:

SomeType val; //make this live throughout the test 
SomeType* pval = nullptr; 

MockClass mymock; 
EXPECT_CALL(mymock, somefunc(_)).WillOnce(SaveArg<0>(pval)); 

//let's force a call 
mymock.somefunc(val); 

EXPECT_NE(nullptr, pval); 

我的觀點是:

如果(1)是真的,那麼會發生什麼:pval = &val - >測試會通過。如果(2)爲真,那麼會發生什麼:*pval = val - >這將導致pval爲空指針的分段錯誤。

我有一個類似於上面的情況,其中我將一個nullptr傳遞給SaveArg並且不會出現段錯誤,但測試也不會傳遞。

如果你們能幫助我,我會非常感激。

由於

回答

1

問題:

SaveArg(指針):保存第N(從0開始)參數*指針。

這是否意味着:

使「指針」點到N個參數,或者給 N個參數的值設置爲任何的「指針」指向?

編輯(由VladLosev修正)它本質上是指針指向的第N個參數的第二個拷貝值。

所以,關於你觀察到的行爲:

我有類似於上面的一個,在那裏我傳遞一個nullptr到 SaveArg並沒有得到段錯誤的情況,但測試不通過 要麼。

這是由於EXPECT_NE的實現細節。下面是來自googletest FAQ對此事進行了一小段:

由於C++的一些特殊性,它需要一些不平凡的模板 元編程技巧使用NULL作爲 EXPECT_XX()和ASSERT_XX的論據來支持()宏。因此,我們只在最需要的地方執行 (否則我們會使Google Test 的實施難以維護,並且比必要時更容易出錯)。

簡短回答,當與googletest比較null時,應使用ASSERT_EQ或EXPECT_EQ或* _TRUE的某些變體。有關更多詳細信息,請按照FAQ條目中的鏈接進行操作。

+1

SaveArg是(2)。 [實施代碼](https://github.com/google/googletest/blob/48ee8e98abc950abd8541e15550b18f8f6cfb3a9/googlemock/include/gmock/gmock-more-actions.h#L172)非常清楚。 – VladLosev

+0

我寫了另一段測試代碼,可以確認(2)是實際行爲。 非常感謝你幫助我@iheanyi VladLosev。 –

相關問題