c++ - 我修改了 gtest/gmock,所以很容易模拟非虚拟函数
问题描述
您知道有时当某些事情不起作用并且想要快速解决时,您会得到愚蠢的想法……我的意思是非常愚蠢的想法。但不知何故,他们工作。因此,为了能够模拟非虚拟函数,我删除了谷歌测试框架中的每个“覆盖”,现在我的程序运行顺利。(不是一个错误。它按预期工作。)
所以我的问题是。这种方法有多大风险,我是不是很蠢 ?
我得出这个结论是因为编写覆盖的唯一两个原因是:
- 使代码更具可读性
- 编译器检查它是否实际上是一种覆盖方法(保护你)
我正在使用 C++
解决方案
我讨厌成为坏消息的承担者,但删除那些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
是非虚拟的。
推荐阅读
- javascript - React onclick 在非类组件上隐藏此组件
- dotfuscator - 有没有办法用 Dotfuscator 定义每个文件的输出文件夹?
- css - 使用节点代理的 CSS 链接
- laravel - Laravel Eager Loading 无法作为数据库查询正常工作
- java - 提高 Apache Spark 到 Redis 的写入性能
- rabbitmq - RabbitMQ Web Stomp -- 关闭非 TLS 连接?
- oracle - Oracle OSM - 履行状态
- html - CSS Grid:将 div 推送到第一列并使其在悬停时跨越 100%
- python - 使用多个范围删除数据框的列
- json - 在 Excel 中使用 VBA 从 API 中检索 Json(API 密码问题)