C ++ gmock - 将null指针传递给SaveArg时会发生什么

时间:2017-10-12 17:24:34

标签: c++ pointers gmock nullptr

我是gmock的新手,我想了解使用SaveArg时会发生什么。

这是我在gmock docu中找到的内容:

SaveArg<N>(pointer):将第N个(从0开始)参数保存到*指针。

这是否意味着:

  1. 使“指针”指向第N个参数,或

  2. 将第N个参数的值赋给“指针”指向的内容吗?

  3. 我正在考虑以下情况:

    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并且没有得到分段错误,但测试也没有通过。

    如果你们能帮助我,真的很感激。

    由于

1 个答案:

答案 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的某些变体。有关详细信息,请单击常见问题条目中的链接。