我修改了 gtest/gmock 所以模拟非虚函数真的很容易
I modified gtest/gmock so it is really easy to mock non-virtual functions
你知道有时候当某些事情不起作用并且你想要快速修复时你会得到愚蠢的想法......我的意思是非常愚蠢的想法。但不知何故,他们工作。
因此,为了能够 模拟非虚拟 函数,我 删除了 google 中的每个 "override"测试框架,现在我的程序运行顺利。
(没有一个错误。它按预期工作。)
所以我的问题是。 这个方法有多风险,我愚蠢 吗?
我得出这个结论是因为写覆盖的唯一两个原因是:
- 使代码更具可读性
- 编译器检查它是否真的是一个要覆盖的方法(保护你)
我正在使用 C++
我讨厌成为坏消息的传递者,但是通过删除那些 overrides
你破坏了安全措施,照搬自己的脚。
非虚拟函数不会添加到 V-table。这意味着如果您执行以下操作:
class Foo
{
public:
int doThings() { return 42; };
}
class MockFoo : public Foo
{
public:
int doThings() { return -1; };
}
您不会有虚函数调用,即如果您在 Foo*
上调用 doThings()
,您将 总是 调用 Foo::doThings()
并得到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()
被调用(即使您提供 MockFoo
),因为 Bar::doBarThings(Foo* foo)
期望 Foo
指针,Foo
中的函数doThings()
是非虚函数。
你知道有时候当某些事情不起作用并且你想要快速修复时你会得到愚蠢的想法......我的意思是非常愚蠢的想法。但不知何故,他们工作。
因此,为了能够 模拟非虚拟 函数,我 删除了 google 中的每个 "override"测试框架,现在我的程序运行顺利。
(没有一个错误。它按预期工作。)
所以我的问题是。 这个方法有多风险,我愚蠢 吗?
我得出这个结论是因为写覆盖的唯一两个原因是:
- 使代码更具可读性
- 编译器检查它是否真的是一个要覆盖的方法(保护你)
我正在使用 C++
我讨厌成为坏消息的传递者,但是通过删除那些 overrides
你破坏了安全措施,照搬自己的脚。
非虚拟函数不会添加到 V-table。这意味着如果您执行以下操作:
class Foo
{
public:
int doThings() { return 42; };
}
class MockFoo : public Foo
{
public:
int doThings() { return -1; };
}
您不会有虚函数调用,即如果您在 Foo*
上调用 doThings()
,您将 总是 调用 Foo::doThings()
并得到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()
被调用(即使您提供 MockFoo
),因为 Bar::doBarThings(Foo* foo)
期望 Foo
指针,Foo
中的函数doThings()
是非虚函数。