模板或链接接缝依赖注入有哪些替代方法可用于测试非虚方法?

时间:2017-06-15 16:46:11

标签: c++ templates testing dependency-injection

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

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

  1. 模板依赖注入:Google称之为hi-perf dependency injection。 mock不再是依赖项的派生类,它将替换为模板类。它被实例化为原始依赖关系的生产类和用于测试的模拟类。

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

  3. 我已成功使用1.但它很快就会失去控制:我会将大部分代码库模板化以处理依赖关系'非虚方法。 2.看起来相当不优雅 - 或许更重要的是 - 对大多数人来说会更加陌生。

    有替代方法吗?根据他们无法控制的大型非虚拟代码库,人们会怎么做?

1 个答案:

答案 0 :(得分:0)

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

#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,该库也可以通过使用特定于平台的技巧覆盖“真实”函数中的指令以跳至一个自由函数来模拟自由函数(只要它们没有内联)。模拟版本。

相关问题