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

nya*_*108 15 c++ mocking googletest googlemock

如何使用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
};
Run Code Online (Sandbox Code Playgroud)

PiQ*_*uer 14

这是Marko答案的另一种选择:如果您不想更改原始代码,只需在mock类中实现帮助:

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 );
    {
};
Run Code Online (Sandbox Code Playgroud)

例如,您仍然需要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));
Run Code Online (Sandbox Code Playgroud)


Mar*_*vic 6

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

void set_enable( bool enabled = true ) { set_enable_impl(enabled); }
Run Code Online (Sandbox Code Playgroud)

现在,在类中MockA,为以下内容创建一个模拟方法set_enable_impl

MOCK_METHOD1( set_enable_impl, void( bool ) );
Run Code Online (Sandbox Code Playgroud)

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

MockA mockA;
EXPECT_CALL(mockA, set_enable_impl(_))...;
Run Code Online (Sandbox Code Playgroud)

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


use*_*953 5

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

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

class MockA : public A
{
    MOCK_METHOD1( set_enable, void( bool enabled ) );
};
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案现在更有意义! (2认同)