[英]Using gmock to mock c-style functions
我有一些 C++ 代碼,我正在從 unistd.h 調用一些 C 函數,例如(打開、關閉、讀取、寫入)等。我試圖模擬這些函數調用,因為我不想在運行時調用實際實現測試。
我做了以下事情:
創建了一個接口:
class InterfaceUnistd
{
public:
InterfaceUnistd() {};
virtual ~InterfaceUnistd() = default;
virtual int open(const char*, int) = 0;
};
創建了一個模擬:
class UniMock : public InterfaceUnistd
{
public:
UniMock() {};
virtual ~UniMock() {};
MOCK_METHOD(int, open, (const char*, int), (override));
};
創建了一個 uni_mock.cc 文件,其中包含:
#include "uni_mock.hpp"
extern UniMock mockobj;
int open(const char *path, int flags) { return mockobj.open(path, flags); }
我將其編譯為共享庫 -luni-mock.so。
在我的測試文件中,我有:
#include "uni_mock.hpp"
#include "somelib.hpp"
class Foo_Fixture : public ::testing
{
};
TEST_F(Foo, Bar)
{
uni_mock mock_obj;
EXPECT_CALL(mock_obj, open("test", _))
.Times(1)
.WillOnce(Return(2));
Fruit apple;
int ret = apple.init("test"); // init calls open //
}
當我運行測試時,我收到以下錯誤:
status = -1
unittest_sensor_core.cc:230: Failure
Actual function call count doesn't match EXPECT_CALL(mock_obj, open("test", _))...
Expected: to be called once
Actual: never called - unsatisfied and active
[ FAILED ] sensor_core_test_support.GW_start_comm (0 ms)
如果我將 mock_obj 移動到全局 scope 上面的錯誤就會消失,但仍然沒有調用 mock open 方法。
我按照這里提到的過程來模擬 c 風格的 function。
全局extern UniMock mockobj;
“uni_mock.cc”中的測試庫是 object uni_mock mock_obj;
(來自重新輸入而不是復制粘貼的錯字?)在您的測試用例TEST_F(Foo, Bar)
中。
您可能想查看我對類似問題的回答,以查看一個可行的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.