如何在Google mock中使用可选参数模拟方法

How to mock method with optional parameter in Google Mock?

本文关键字:参数 模拟 方法 Google mock      更新时间:2023-10-16

如何在Google mock中用可选参数模拟方法?例如:

class A
{ 
public:
    void set_enable( bool enabled = true );
};
class MockA : public A
{
    MOCK_METHOD1( set_enable, void( bool ) );    // this is not working
};

这是Marko答案的替代方案:如果你不想更改原始代码,只需在mock类中实现helper:

class A
{ 
public:
    virtual void set_enable( bool enabled = true );
};
class MockA : public A
{
    MOCK_METHOD1( set_enable_impl, void( bool ) );
    virtual void set_enable( bool enabled = true )
    {
        set_enable_impl( enabled );
    }
};

在测试中仍然需要调用set_enable_impl,例如

MockA mockA;
EXPECT_CALL(mockA, set_enable_impl(true)).Times(Exactly(1));
EXPECT_CALL(mockA, set_enable_impl(false)).Times(Exactly(1));

将方法set_enable的实现更改为使用辅助方法,如下所示:

void set_enable( bool enabled = true ) { set_enable_impl(enabled); }

现在,在类MockA中,为set_enable_impl:创建一个mock方法

MOCK_METHOD1( set_enable_impl, void( bool ) );

然后,在您的生产代码中,您只需像最初一样使用set_enable,而在测试中,您可以设置对方法set_enable_impl:的期望

MockA mockA;
EXPECT_CALL(mockA, set_enable_impl(_))...;

另一种选择是通过具有一个和零个参数的版本来重载该方法。由您决定哪种方式更适合您的情况。

对PiQuer答案的一些修改。如果只将名称"enabled"添加到MOCK_METHOD1中bool类型的变量中,则不需要包装器,如下所示:

class A
{ 
    public:
    void set_enable( bool enabled = true );
};
class MockA : public A
{
    MOCK_METHOD1( set_enable, void( bool enabled ) );
};

设置两个模拟,如下所示:

class MockA : public A
{
    MOCK_METHOD1( set_enable, void( bool ) );
    MOCK_METHOD1( set_enable, void( ) );
};