簡體   English   中英

使用 gmock 模擬 c 風格的函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM