gpt4 book ai didi

c++ - G测试 : mocking non-virtual member function

转载 作者:行者123 更新时间:2023-11-30 04:50:19 34 4
gpt4 key购买 nike

考虑以下代码片段:

source.hpp

class tracker
{
public:
static tracker& get_instance()
{
static tracker instance;
return instance;
}

tracker(const tracker&) = delete;
tracker& operator=(const tracker&) = delete;

private:
tracker()
{
_ip_count = settings::get_instance().get_ips();
// ...
}

private:
int _ip_count;
};

test.cpp

#include "source.hpp"
#include "settings.hpp"

#include "gtest/gtest.h"
#include "gmock/gmock.h"

struct MockSettings
{
MOCK_CONST_METHOD0(get_ips, int());
};

TEST(tracker, _)
{
// Need to mock settings::get_instance().get_ips() function here
tracker& inst = tracker::get_instance();
}

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

正如您在 test.cpp 中看到的,我正在获取 tracker 的实例,因此 settings::get_instance().get_ips()函数被调用。实际上,我不需要调用后一个函数,相反,我想返回,例如 3。考虑到 get_ips()非虚拟 函数,我该怎么做。如果可能的话,我不想更改源代码。我还阅读了以下文档 https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md ,却达不到我想要的结果。

最佳答案

看来您可能遇到的问题是您正在尝试模拟类 settings ,但是 tracker 的构造函数无法实际使用您的模拟设置类,因为它在编译时固定为直接引用 settings .

食谱实际上解释了如何解决这个问题,在“Mocking Nonvirtual Methods”下:首先,你创建你的模拟类,然后你提供一些依赖注入(inject)的方法,允许你在编译时类的生产和模拟版本。一种方法是使跟踪器成为使用设置类参数化的类模板,如下所示:

template <typename settings_class> class tracker_template
{
public:
static tracker_template<settings_class>& get_instance()
{
static tracker_template<settings_class> instance;
return instance;
}

// ...

private:
tracker_template()
{
_ip_count = settings_class::get_instance().get_ips();
// ...
}

// ...
};

之后你可以,例如。 using tracker = tracker_template<settings>;继续在您的生产代码中使用跟踪器,而是使用 tracker_template<MockSettings>在你的测试代码中。

可能没有办法在不更改代码的情况下解决这个问题。

关于c++ - G测试 : mocking non-virtual member function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55044969/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com