c++ - 在另一个类中使用 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;
};
}
}
}
解决方案
如果您想拥有这个模拟类的所有者,则使用 IMOunique_ptr
是一种方法,并且所有者是被测类。请参阅这篇文章,它显示了如何使用unique_ptr
这种上下文。但是,为简单起见,我建议从常规引用开始 - 一开始会更容易。
关于您的实现:您的模拟和生产类需要一个基类(最好是没有字段的纯抽象类,只有虚拟方法),您的生产和模拟类从该基类派生(在附加的帖子中,这是IBar
)。此接口在您的测试类中使用(Foo
在帖子中或Dopy
在您的代码中)。然后,您需要用于生产代码的真实类(Bar
在帖子中或dpc
在您的代码中)和在测试中使用的模拟类(BarMock
或)。dpcMock
您需要使用依赖注入,即将这个纯抽象类提供给您的测试类——真实用于生产,模拟用于测试。在测试环境中,您可以对模拟设置期望并在被测类上执行代码。
在这一点上,我看不到如何dcp
并且Dopy
正在一起工作,但我认为你应该dcp
以Dopy
某种方式提供(例如在 ctor 中)。
推荐阅读
- firebase - 如何获取已上传到 Firebase 存储的第一个孩子?
- python - 如何使用 NamedTuple 子类作为从 Deque 继承的泛型类的项类型
- java - 将 Principal 绑定到 MyCustomUser 类作为控制器中的方法参数
- flutter - Flutter 键盘 gif 支持
- azure-aks - 使用 Azure 磁盘的 AKS 动态持久卷声明
- epplus-4 - 未找到 FileInfo() 类型或命名空间
- python - 如何在 Python 中使用包装列读取数据?
- javascript - 从 frida cli 中加载的脚本调用自己的函数 - 输出“未定义”
- ios - Swift 4 数据到 UIImage 为 PNG
- google-app-engine - GAE/standard/second/Python 上的 Spacy 超过了最大实例的内存