2016-09-05 34 views
4

我在gmock学习。现在,我试着去嘲笑为“任务”之类的,就像这样:是什么saveArg和saveArgPointee的gmock区别?

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

我想保存结构PDATA当task.excute被调用,这样我可以验证pdata->成员。这是我的代码:

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

这是正确的吗? saveArg和saveArgPointee有什么区别?

回答

5

正如你可以在gmock doc读:

SaveArg(指针)保存第N(从0开始)参数来*指针。

SaveArgPointee(指针)保存的值所指向的第N(从0开始)参数来*指针。

对于你的情况,你应该使用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); 
} 
1
If I replace the test 
TEST(TestSomeFoo, shallPassOne) 
{ 
    SomeData actualData{}; 
    SomeMock aMock; 
    EXPECT_CALL(aMock, foo(_)).WillOnce(::testing::SaveArgPointee<0>(&actualData)); 
    someFunction(aMock); 
    ASSERT_EQ(1, actualData.a); 
} 

as 

TEST(TestSomeFoo, shallPassOne) 
{ 
    SomeData actualData{1}; 
    SomeMock aMock; 
    EXPECT_CALL(aMock, foo(actualData)).Times(1); 
    someFunction(aMock); 
} 

这会不会是相同的或有什么差别?

+0

我已经尝试了上面两个测试。这两个测试的结果是不同的。 – XHLin

相关问题