c++ - gmock中saveArg和saveArgPointee有什么区别?

标签 c++ googlemock

我正在 gmock 学习。现在我试图模拟名为“任务”的类,如下所示:

class MockTask : public Task
{
public:
    MOCK_METHOD3(Execute, bool(std::set<std::string> &setDeviceIDs, int timeout, PACKET_DATA *Data));
};

而且我想在调用 task.excute 时保存结构 pdata,以便我可以验证 pdata-> 成员。这是我的代码:

PAKET_DATA data;
EXPECT_CALL(task, Execute(testing::_, testing::_, testing::_))
    .WillOnce(testing::saveArg<2>(&data));
ASSERT_EQ(data->resultcode, 0);

这样对吗? saveArg 和 saveArgPointee 有什么区别?

最佳答案

正如您在 gmock doc 中所读到的那样:

SaveArg(pointer) Save the N-th (0-based) argument to *pointer.

SaveArgPointee(pointer) Save the value pointed to by the N-th (0-based) argument to *pointer.

对于您的情况,您应该使用 SaveArgPointee - 因为您要保存指向的数据 (PACKET_DATA *Data) - 而不是指针本身...

看这个例子:

struct SomeData { int a; };
class ISomeClass
{
public:
    virtual ~ISomeClass() = default;
    virtual void foo(SomeData*) = 0;
};

void someFunction(ISomeClass& a)
{
    SomeData b{1};
    a.foo(&b);
}

class SomeMock : public ISomeClass
{
public:
    MOCK_METHOD1(foo, void(SomeData*));
};

要测试 someFunction,您需要检查传递给 foo 的 pointee:

TEST(TestSomeFoo, shallPassOne)
{
    SomeData actualData{};
    SomeMock aMock;
    EXPECT_CALL(aMock, foo(_)).WillOnce(::testing::SaveArgPointee<0>(&actualData));
    someFunction(aMock);
    ASSERT_EQ(1, actualData.a);
}

如果您使用了 SaveArg - 您将只存储指向不再存在的局部变量的指针:

TEST(TestSomeFoo, shallPassOne_DanglingPointer)
{
    SomeData* actualData;
    SomeMock aMock;
    EXPECT_CALL(aMock, foo(_)).WillOnce(::testing::SaveArg<0>(&actualData));
    someFunction(aMock);
    ASSERT_EQ(1, actualData->a);
}

关于c++ - gmock中saveArg和saveArgPointee有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39323381/

相关文章:

c++ - 死亡测试时错误的函数调用评估

c++ - OpenCV 不适用于 Visual Studio

c++ - 尝试使用命名空间中的函数时出现错误 LNK2019

c++ - T declval() 而不是 T && declval() for common_type

c++ - 我应该使用什么结构来模拟用于桌面测试的嵌入式系统类?

visual-studio-2010 - Visual Studio 2010 和 MSTest (C++/CLI) 的 GoogleMock 问题

c++ - 在 Code::blocks 上设置 CLANG 3.4

c++ - 用Qt构建FS路径的跨平台方式

c++ - 用谷歌测试重载函数

c++ - 需要谷歌模拟帮助,