首页 > 解决方案 > 在另一个类中使用 MOCK 函数

问题描述

我尝试隔离我的类,因此由于使用模拟实现交换外部自由函数,因此,我为自由函数创建了模拟类,该模拟类在另一个类中有外部依赖性。那么我将如何在我的课堂上调用这个模拟函数呢?

您可以向我建议任何实施吗?

我正在考虑创建一个唯一指针并通过它调用,但我对此不太确定。

我应该遵循哪种方法呢?

#include "source/common/main/dpc.hpp"
#include "source/common/main/dt.hpp"

#include <gmock/gmock.h>

namespace test {

namespace {

class dpcMock
{
public:
    MOCK_METHOD(bool, isVS, (const uint32_t id), ());

    MOCK_METHOD(St, gpType, (const uint32_t width), ());

    static dpcMock* activeMock;
};

} 
} 


#include "dpcMock.hpp"
#include "source/common/main/dpc.hpp"
#include <CppUTestExt/MockSupport.h>

test::dpcMock* test::dpcMock::activeMock = nullptr;

namespace common{
namespace main{
namespace {

bool isVS(const uint32_t id)
{
    if (::test::dpcMock::activeMock == nullptr)
    {
        return true;
    }
    return test::dpcMock::activeMock->isVS(id);
}

inline St gpType(const uint32_t width)
{
    if (::test::dpcMock::activeMock == nullptr)
    {
        return {};
    }
    return test::dpcMock::activeMock->gpType(width);
}

}
} 
} 

#include <memory>
#include <set>

#include "common/main/bm.hpp"
#include "common/main/ut/mocks/dpcMock.hpp"

namespace lucky{
namespace trap{
namespace main{

using namespace common::main;

class Dopy
{
public:
    void cDL(const sDL& sDLp);
    void cUL(const sUL& sULp);

    void csDL(const sDL& sDLp);
    void csUL(const sUL& sULp);

private:
    std::unique_ptr<sa> sa_fr;
    std::unique_ptr<bm> bm_fr;
};

} 
} 
}

标签: c++googlemock

解决方案


如果您想拥有这个模拟类的所有者,则使用 IMOunique_ptr是一种方法,并且所有者是被测类。请参阅这篇文章,它显示了如何使用unique_ptr这种上下文。但是,为简单起见,我建议从常规引用开始 - 一开始会更容易。

关于您的实现:您的模拟和生产类需要一个基类(最好是没有字段的纯抽象类,只有虚拟方法),您的生产和模拟类从该基类派生(在附加的帖子中,这是IBar)。此接口在您的测试类中使用(Foo在帖子中或Dopy在您的代码中)。然后,您需要用于生产代码的真实类(Bar在帖子中或dpc在您的代码中)和在测试中使用的模拟类(BarMock或)。dpcMock您需要使用依赖注入,即将这个纯抽象类提供给您的测试类——真实用于生产,模拟用于测试。在测试环境中,您可以对模拟设置期望并在被测类上执行代码。

在这一点上,我看不到如何dcp并且Dopy正在一起工作,但我认为你应该dcpDopy某种方式提供(例如在 ctor 中)。


推荐阅读