gpt4 book ai didi

c++ - 如何模拟已经编译到库中的类?

转载 作者:行者123 更新时间:2023-11-30 03:52:03 25 4
gpt4 key购买 nike

我们的代码库有一组组件。每个组件都包含“公共(public)”/可重用代码,其形式为内置于静态库中的独立项目。组件示例:UI 小部件、容器、网络等。

当我为我们的 UI 小部件编写单元测试时,我实际上是在构建一个链接到“UI 小部件”静态库的可执行文件。

当涉及到模拟时,这会使事情变得复杂。我读过的普通模拟方法(依赖注入(inject)/控制反转)的演示方式在被模拟的代码已经编译时似乎很难(如果不是不可能的话)。

如果我的 UI Widgets 静态库包含大约 20 个类的实现,我可能只需要模拟其中的 5 个。因此,我需要以某种方式告诉我的测试可执行文件使用静态库中的 15 个符号,但忽略 5 个(并支持另一个库中的模拟实现,或者理想情况下直接编译到测试可执行文件中)。

如何有效地模拟静态库中的类?我可以想出一些通过使用运行时多态性 + 接口(interface)模式来做到这一点的方法,但是我也希望能够使用模板进行模拟。仅根据我的项目结构,在这里使用模板对我来说似乎更遥不可及。

最佳答案

免责声明我在 Typemock 工作。

使用模板和多态性进行“模拟”会迫使您调整生产代码以适应您的测试,例如在您通常不会这样做的地方添加冗余的间接级别和使用接口(interface),有时会破坏您的原始设计。

引入新的类和接口(interface)(需要维护),最终使代码变得更大、可读性更差并且不像您希望的那样简单明了,从而使代码复杂化。

Typemock Isolator++通过使您能够在运行时模拟任何东西(*抽象类、非虚拟类、静态类、非公共(public)类、c 函数等...)来解决这个问题,在您内部在与生产代码分开的库中进行测试。

重构生产代码以提高可测试性时,没有破坏生产代码的风险。

例如:

class MyClass
{
int GetResult() { return -1; }
}

通过以下方式伪造:

MyClass* fakeMyClass = FAKE<MyClass>();
WHEN_CALLED(fakeMyClass->GetResult()).Return(10);

查看更多examples .

关于c++ - 如何模拟已经编译到库中的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30919574/

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