我有一个类似的代码:
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对象的构建都是在测试编码的上下文中完成的。然后,它需要以如上所述的某种方式"注入"到要测试的代码中。