2016-03-04 70 views
1

我有一個測試是這樣的:GMock - 如何刷新模擬返回值?

#include <gmock/gmock.h> 

using namespace ::testing; 

class IMyInterface 
{ 
public: 
    virtual ~IMyInterface() = default; 
    virtual void* DoAllocate(size_t size) = 0; 
}; 

class MockMyInterface : public IMyInterface 
{ 
public: 
    MOCK_METHOD1(DoAllocate, void*(size_t)); 
}; 

class InterfaceUser 
{ 
public: 
    void DoIt(IMyInterface& iface) 
    { 
     void* ptr = iface.DoAllocate(1024); 
     free(ptr); 
     ptr = iface.DoAllocate(1024); 
     free(ptr); 
    } 
}; 

TEST(MyTest, AllocateMock) 
{ 
    MockMyInterface mockIFace; 

    EXPECT_CALL(mockIFace, DoAllocate(1024)).WillRepeatedly(Return(malloc(1024))); 

    InterfaceUser user; 
    user.DoIt(mockIFace); 
} 

int main(int numArgs, char** args) 
{ 
    ::testing::InitGoogleMock(&numArgs, args); 
    return RUN_ALL_TESTS(); 
} 

這會崩潰,因爲被測試通話DoAllocate1024兩次「真正的」代碼。但gmock似乎只有這樣做:

Return(malloc(1024)) 

有一次,即使它被稱爲兩次。顯然這是一個問題,因爲它意味着malloc被調用一次1024,然後「真正的」代碼釋放相同的指針兩次。

如何強制gmock在每次模擬調用中實際執行malloc(1024)

回答

1

設置你期望通過預分配的緩衝區,像這樣:

void *buffer1 = malloc(1024); 
void *buffer2 = malloc(1024); 

EXPECT_CALL(mockIFace, DoAllocate(1024)).Times(2) 
    .WillOnce(Return(buffer1)) 
    .WillOnce(Return(buffer2)); 
+0

感謝 - 打開你的malloc調用可以返回()這樣太:) – paulm

+0

@paulm歡迎您內內聯!我已經很快就寫出了答案,並且由於我並不是100%確定如果在「Return」中內聯可以工作,我已經使用了臨時對象。 :) –