谷歌测试框架:最好使用阴影或虚拟方法
Google Test Framework: is better to use shadowing or virtual methods?
在下面的例子中,我想对class A
进行单元测试,以验证当调用A::request
时,也会调用B::response()
:
class A
{
public:
void request()
{
m_b.response();
}
private:
B m_b;
};
class B
{
public:
void response();
};
为了做到这一点,必须模拟class B
:
class MockB : public B
{
public:
MOCK_METHOD0( response, void());
};
因此测试将包含:
class TestA : public A
{
...
};
...
EXPECT_CALL( m_b, response( ) ).Times( 1 );
request( );
...
问题是:如何"注入"MockB
作为B m_b
的替代品?
第一个技术:创建一个ShadowB
类,将方法调用重定向到class MockB
。这要求原始代码为外部二进制,但不需要对实际代码进行任何更改。
第二个技术:
- 制作
B::response
virtual
- 将
B m_b
更改为std::unique_ptr<B> m_b
- 在测试设置期间用
class MockB
的实例替换m_b
值
第二种方法意味着更多的代码更改,我不确定它的专业性。
解决问题的正确方法是第二种技巧。更普遍地说,很难将单元测试代码"复古"到没有考虑到它的组件上——你几乎总是需要显著修改正在测试的代码。
使用虚拟函数来代替真实的Mock回调对象,两者都是从公共接口继承的,这是一种非常常见的方法。另一种选择是让正在测试的类成为模板类,并用Mock对象替换它们的模板参数。
相关文章:
- 虚拟决赛作为安全
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 如何在C++中获得"静态纯虚拟"功能?
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 大小虚拟继承中的派生类
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- std::is_trivially_copyable_v 关于虚拟功能
- 删除C++继承中虚拟类成员的代码重复
- 子类地址等于虚拟基类地址?
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 用于创建/注册虚拟存储设备的 IOKit 驱动程序
- 谷歌测试框架:最好使用阴影或虚拟方法