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)
更改方法的实现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)
另一种方法是通过具有一个和零个参数的版本来重载该方法。由您决定哪种方式更适合您的情况。
对 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)