使用预处理器模拟非虚拟方法



我正在C++中开发一个嵌入式项目,那里的资源有点有限。这意味着我尽量小心使用过多的虚拟方法,除非我真的需要它们。我计划开始实现单元测试,也许是用Gtest。

因为项目的代码大小不太大,所以大多数代码都直接写在头文件中。唯一的惩罚是多一点编译时间。由于编译大约需要20秒,所以这不是一个问题,在我看来,这会使代码更容易编写/读取。

如果项目在Windows中运行,我会全力创建新的抽象层(或添加接缝类(,并在单元测试需要的地方拥有更多的虚拟方法。由于项目的性质,我不想仅仅为了单元测试的目的而添加额外的虚拟方法。我认为这样做是有效的,但在资源稀缺的情况下似乎有点不合理。

该项目运行良好,单元测试也很好,所以我希望将代码修改降至最低。该问题的解决方案之一是使用";高性能依赖性注入";。在我看来,这就像鸭子打字,仍然需要修改使用该类的原始源代码。

我在想为什么不直接使用预处理器:

#ifdef TEST
#define TESTABLE virtual
#else
#define TESTABLE
#endif

然后,当一个方法需要被嘲笑时,你可以随时修改该类的原始源代码,并写一些类似的东西:

TESTABLE void somePreviouslyUnmockeableMethod(void);

我知道缺点之一是我现在有两个源代码,一个用于生产,另一个用于测试。当一个人决定在单元测试时使用Mock类而不是真正的类时,同样的情况也会发生。如果代码变化很大,预处理器的变化可能是一个真正的问题,但我认为根据这个定义,它们会保持在最低限度。

这是一个有效的解决方案吗?我可能忽略了一些负面后果吗?

请注意,所有模块都已经包括一个ProjectSettings.h文件,其中可以轻松添加TESTABLE定义。

如果使类虚拟化的成本真的太高(即您测量到这将是太多的开销(,则可以使用高性能依赖注入技术。这样做的代价只是编译时间更长,但没有运行时开销。在生产中,您可以用真实对象实例化类,在测试中,使用具有与真实类相同签名的方法的模拟类。

相关内容

最新更新