Google Test Framework:最好使用阴影或虚拟方法吗?

时间:2016-07-28 10:38:00

标签: c++ unit-testing testing googletest googlemock

在下面的示例中,我想进行单元测试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

First tecnique : 创建一个ShadowB类,将方法调用重定向到class MockB。这要求原始代码在外部二进制文件中,但不需要对实际代码进行任何更改。

第二次tecnique

  • 制作B::response virtual
  • B m_b更改为std::unique_ptr<B> m_b
  • 在测试设置期间将m_b值替换为class MockB的实例

第二种方法意味着更多的代码更改,我不确定它的专业。

1 个答案:

答案 0 :(得分:1)

解决问题的正确方法是第二种技术。更一般地说,很难适应“复古”。将代码测试到未使用它设计的组件上 - 您几乎总是需要显着修改正在测试的代码。

使用虚函数替换Mock回调对象代替真实回调对象,两者都是从公共接口继承的,这是一种非常常见的方法。另一种方法是让您的类被测试为模板类,并用Mock对象替换它们的模板参数。