2016-09-05 33 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

相關問題