2017-10-12 71 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。 –

相关问题