我有这样的代码:
void ClassA::Function()
{
ClassB b;
if (b.doSomething())
{
// ...
}
}
并针对classB进行模拟:
class ClassBMock: public classB
{
MOCK_METHOD(doSomething, bool(void));
}
是否可以通过创建ClassBMock而不是ClassB来测试此功能,所以我可以使用EXPECT_CALL并控制doSomething返回什么?
答案 0 :(得分:1)
否,如果您在要测试的函数的上下文中实例化类型为ClassB
的对象,则编译器(和链接器)将确保您获得类型为ClassB
的对象;)
例如,您可以执行以下操作来获取模拟类的实例:通过builder,factory function来实现,或者您只需将指向对象b
的指针作为参数传递给Function()
。这样,您可以在测试代码时注入模拟对象。
幸运的是,我们正在谈论C ++,因此还有另一种可能的方法:如果在测试环境中编译/链接了class ClassB
,请提供ClassA::Function()
的不同定义。
即构建测试时,您需要具有不同的“构建树”。在这里,您可以引用生产性源树的源文件,其中包含要测试的方法。 但是,您可以使用模拟定义ClassB
包含其他标头,而不是有效的标头。如果ClassB
是在其他库中定义的,则可以链接其模拟版本。
这不是特定于GMock的。
此Cookbook中总结了GMock可以为您做什么。在几乎任何情况下,您都可以看到模拟/伪造对象的构造是在测试编码的上下文中完成的。然后需要以上述某种方式将其“注入”到待测试的代码中。