谷歌测试框架:最好使用阴影或虚拟方法

Google Test Framework: is better to use shadowing or virtual methods?

本文关键字:阴影 虚拟 方法 测试 框架 谷歌      更新时间:2023-10-16

在下面的例子中,我想对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对象替换它们的模板参数。