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

How to mock method with optional parameter in Google Mock?

如何在 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
};

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

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

现在,在 class 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(_))...;

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

这是 Marko 回答的另一种选择:如果您不想更改原始代码,只需在 mock class:

中实现帮助程序
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));

对 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( ) );
};