我是gmock的新手,我想了解使用SaveArg时会发生什么。
这是我在gmock docu中找到的内容:
SaveArg<N>(pointer)
:将第N个(从0开始)参数保存到*指针。
这是否意味着:
使“指针”指向第N个参数,或
将第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
- &gt;测试将通过。
如果(2)为真,那么会发生什么:*pval = val
- &gt;这将导致pval的分段错误为空指针。
我的情况类似于上面的情况,我将nullptr传递给SaveArg并且没有得到分段错误,但测试也没有通过。
如果你们能帮助我,真的很感激。
由于
答案 0 :(得分: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的某些变体。有关详细信息,请单击常见问题条目中的链接。