gpt4 book ai didi

c++ - 对于测试非虚拟方法,模板或链接接缝依赖注入(inject)有哪些替代方案?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:08 25 4
gpt4 key购买 nike

我正在尝试测试对无法更改且通常不使用虚拟方法的代码有很多依赖性的代码。这也是一个高性能场景,所以我可以想象在我们自己的代码中的某些地方我们不想使用虚拟方法。非虚拟方法对测试场景很重要,所以我想模拟它们。

据我了解,主要有两种选择:

  1. 模板依赖注入(inject):谷歌称之为 hi-perf dependency injection . mock不再是依赖的派生类,取而代之的是模板类。它被实例化为用于生产的原始依赖类和用于测试的模拟类。

  2. Link seams :将测试类命名为与生产类相同的名称,并在链接测试时使用链接器技巧将其替换为生产实现。

我已经成功地使用了 1. 但它很快就会失去控制:我将模板化大部分代码库来处理依赖项的非虚拟方法。 2. 看起来相当不雅,也许更重要的是,大多数人会更加陌生。

是否有替代方法?人们在依赖他们无法控制的大型非虚拟代码库时会做什么?

最佳答案

我以前见过另一种方法:创建一个只有内联成员函数的瘦包装类,这些成员函数只是转发到外部库,但通过预处理器宏使它们有条件地成为虚拟的。然后在用于测试的构建中定义宏,以便您可以覆盖模拟中的成员函数,而在生产构建中您不定义宏,以便编译器可以将库调用内联为所有成员函数的定义 wrapper 可见。

#ifdef TEST_BUILD
#define VIRTUAL virtual
#else
#define VIRTUAL
#endif

class library_wrapper {
public:
VIRTUAL void foo(int i) {
::externallib::foo(i);
}
};

class library_wrapper_mock : public library_wrapper {
public:
MOCK_METHOD1(foo, void(int));
}

当然,这意味着您无法再测试您正在交付的构建,但这是在生产构建中不使用虚拟函数的性能增益的权衡。

另一种选择是使用不同的模拟库,例如 Hippomocks,它也可以通过使用特定于平台的技巧来模拟自由函数(只要它们不是内联的)来覆盖“真实”函数中的指令以跳转到模拟版本。

关于c++ - 对于测试非虚拟方法,模板或链接接缝依赖注入(inject)有哪些替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44572823/

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