我可以使用gMock模拟经过测试的代码中的对象创建吗?

时间:2018-11-30 15:06:32

标签: c++ googletest gmock

我有这样的代码:

void ClassA::Function()
{
    ClassB b;
    if (b.doSomething())
    {
        // ...
    }
}

并针对classB进行模拟:

class ClassBMock: public classB
{
    MOCK_METHOD(doSomething, bool(void));
}

是否可以通过创建ClassBMock而不是ClassB来测试此功能,所以我可以使用EXPECT_CALL并控制doSomething返回什么?

1 个答案:

答案 0 :(得分:1)

否,如果您在要测试的函数的上下文中实例化类型为ClassB的对象,则编译器(和链接器)将确保您获得类型为ClassB的对象;)

例如,您可以执行以下操作来获取模拟类的实例:通过builderfactory function来实现,或者您只需将指向对象b的指针作为参数传递给Function()。这样,您可以在测试代码时注入模拟对象。

幸运的是,我们正在谈论C ++,因此还有另一种可能的方法:如果在测试环境中编译/链接了class ClassB,请提供ClassA::Function()的不同定义。
即构建测试时,您需要具有不同的“构建树”。在这里,您可以引用生产性源树的源文件,其中包含要测试的方法。 但是,您可以使用模拟定义ClassB包含其他标头,而不是有效的标头。如果ClassB是在其他库中定义的,则可以链接其模拟版本。

这不是特定于GMock的。

Cookbook中总结了GMock可以为您做什么。在几乎任何情况下,您都可以看到模拟/伪造对象的构造是在测试编码的上下文中完成的。然后需要以上述某种方式将其“注入”到待测试的代码中。