C++ gmock - 将空指针传递给SaveArg时会发生什么
我是gmock的新手,我想了解使用SaveArg时发生的情况。C++ gmock - 将空指针传递给SaveArg时会发生什么
这是我在gmock实况发现:
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
- >测试会通过。如果(2)为真,那么会发生什么:*pval = val
- >这将导致pval为空指针的分段错误。
我有一个类似于上面的情况,其中我将一个nullptr传递给SaveArg并且不会出现段错误,但测试也不会传递。
如果你们能帮助我,我会非常感激。
由于
问题:
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条目中的链接进行操作。
SaveArg是(2)。 [实施代码](https://github.com/google/googletest/blob/48ee8e98abc950abd8541e15550b18f8f6cfb3a9/googlemock/include/gmock/gmock-more-actions.h#L172)非常清楚。 – VladLosev
我写了另一段测试代码,可以确认(2)是实际行为。 非常感谢你帮助我@iheanyi VladLosev。 –