【问题标题】:C++ gmock - what happens when passing null pointer to SaveArgC ++ gmock - 将空指针传递给SaveArg时会发生什么
【发布时间】:2017-10-12 17:24:33
【问题描述】:

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

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

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

这是什么意思:

  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 = &amp;val --> 测试将通过。

如果 (2) 为真,那么会发生:*pval = val --> 这将导致 pval 为空指针的分段错误。

我的情况与上面类似,我将 nullptr 传递给 SaveArg 并且没有出现分段错误,但测试也没有通过。

如果你们能帮助我,将不胜感激。

谢谢

【问题讨论】:

    标签: c++ pointers gmock nullptr


    【解决方案1】:

    问题:

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

    这是什么意思:

    使“指针”指向第 N 个参数,或者赋值 “指针”指向的任何内容的第 N 个参数?

    编辑(由 VladLosev 更正)本质上是第二个,将第 N 个参数的值复制到指针指向的任何内容。

    所以,关于您观察到的行为:

    我的情况与上述类似,我将 nullptr 传递给 SaveArg 并没有得到分段错误,但测试没有通过 要么。

    这是由于 EXPECT_NE 的实现细节。以下是来自googletest FAQ 的关于此事的简短 sn-p:

    由于 C++ 的一些特殊性,它需要一些非平凡的模板 支持使用 NULL 作为参数的元编程技巧 EXPECT_XX() 和 ASSERT_XX() 宏。因此我们只在它所在的地方做 最需要的(否则我们会执行 Google Test 比必要的更难维护和更容易出错)。

    简短的回答,当与 googletest 比较 null 时,您应该使用 ASSERT_EQ 或 EXPECT_EQ 或 *_TRUE 的一些变体。有关更多详细信息,请点击常见问题解答条目上的链接。

    【讨论】:

    • SaveArg 为 (2)。 implementation code 非常清楚。
    • 我又写了一段测试代码,可以确认 (2) 是实际行为。非常感谢@iheanyi VladLosev 帮助我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2015-09-21
    • 2018-08-11
    • 1970-01-01
    • 2018-07-21
    • 2016-12-23
    相关资源
    最近更新 更多