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



我有一个类似的代码:

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

B类模拟:

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

有没有可能测试这个函数,创建ClassBMock而不是ClassB,这样我就可以使用EXPECT_CALL并控制doSomething返回什么?

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

例如,您可以通过构建器、工厂函数或简单地将指向对象b的指针作为参数传递给Function()来获得mock类的实例。通过这种方式,您可以在测试代码时注入一个mock对象。

幸运的是,我们谈论的是C++,因此还有一种可能的方法:在测试上下文中编译/链接ClassA::Function()的情况下,提供class ClassB的不同定义
也就是说,在构建测试时,您需要有一个不同的"构建树"。在这里,您可以参考生产源树的源文件,其中包含要测试的方法但是您可以使用ClassB的模拟定义而不是生产性定义来包含不同的头。如果ClassB是在其他库中定义的,您可以链接它的模拟版本

所有这些并不是针对GMock的。

GMock能为你做什么,在这本食谱中有很好的总结。您可以看到,在几乎任何情况下,mock/fake对象的构建都是在测试编码的上下文中完成的。然后,它需要以如上所述的某种方式"注入"到要测试的代码中。

相关内容

  • 没有找到相关文章

最新更新