首页 > 解决方案 > 我修改了 gtest/gmock,所以很容易模拟非虚拟函数

问题描述


您知道有时当某些事情不起作用并且想要快速解决时,您会得到愚蠢的想法……我的意思是非常愚蠢的想法。但不知何故,他们工作。因此,为了能够模拟非虚拟函数,我删除了谷歌测试框架中的每个“覆盖”,现在我的程序运行顺利。(不是一个错误。它按预期工作。)

所以我的问题是。这种方法有多大风险,我是不是很蠢

我得出这个结论是因为编写覆盖的唯一两个原因是:

我正在使用 C++

标签: c++unit-testingoverridinggoogletestgmock

解决方案


我讨厌成为坏消息的承担者,但删除那些overrides你禁用安全装置的人会在众所周知的脚上开枪。

非虚函数不会添加到 V 表中。这意味着,如果您执行以下操作:

class Foo
{
  public:
    int doThings() { return 42; };
}

class MockFoo : public Foo
{
  public:
    int doThings() { return -1; };
}

你不会有虚函数调用,即如果你调用doThings()aFoo*总是调用Foo::doThings()和 get 42,无论底层对象是 Foo 还是 MockFoo 。或者换句话说:

class Bar
{
  public:
    int doBarThings(Foo* foo) { return foo->doThings() + 10; };
}

TEST_F(BarTest, doThings)
{
    Bar bar;
    MockFoo mockFoo;
    bar->doBarThings(&mockFoo);
}

始终导致Foo::doThings()被调用(即使您提供了 a MockFoo),因为Bar::doBarThings(Foo* foo)需要一个Foo指针,并且函数doThings()inFoo是非虚拟的。


推荐阅读