gmock中saveArg和saveArgPointee有什么区别?
What is the difference of saveArg and saveArgPointee in gmock?
我在gmock学习。现在我正在尝试模拟名为 "task" 的 class,像这样:
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
:
的指针对象
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);
}
我在gmock学习。现在我正在尝试模拟名为 "task" 的 class,像这样:
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
:
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);
}