我们的代码库包含一组组件。每个组件都以内置在静态库中的独立项目的形式包含“通用” /可重用代码。组件示例:UI窗口小部件,容器,网络等。
当我为UI小部件编写单元测试时,实际上是在构建一个链接到“UI小部件”静态库的可执行文件。
当涉及到 mock 时,这会使事情变得复杂。我已经读过的普通模拟方法(依赖注入(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。