如何模拟已经编译成库的类?

时间:2015-06-18 15:24:23

标签: c++ unit-testing mocking

我们的代码库有一组组件。每个组件都以静态库中内置的独立项目的形式包含" common" /可重用代码。组件示例:UI小部件,容器,网络等

当我为UI小部件编写单元测试时,我实际上构建的是一个可执行文件,它链接了" UI Widgets"静态库。

说到嘲笑,这会让事情变得复杂。我已经读过的关于(依赖注入/控制反转)的正常模拟方法以这样一种方式进行演示,当被模拟的代码已经被编译时,这种方式似乎很难(如果不是不可能的话)。

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

如何有效地模拟静态库中的类?我可以通过使用运行时多态性+接口模式来思考一些方法,但是我也喜欢能够使用模板进行模拟。使用模板对我来说似乎更难以实现,只是基于我的项目结构。

1 个答案:

答案 0 :(得分:2)

免责声明我在Typemock工作。

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

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

Typemock Isolator++通过使您能够在运行时模拟ANYTHING(*抽象类,非虚拟,静态,非公共,c函数等)来解决此问题,您可以在与生产分开的库中进行测试代码。

在重构生产代码时,没有破坏生产代码的风险。

例如:

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

以下列方式伪造:

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

查看更多examples