是否可以为参数包中的每个参数创建模拟方法?
Is it possible to have create mock method for each argument from parameter pack?
编辑:
我有 classes 接收消息:
class Foo {
public:
void receive(FooMessage& message));
// other messages
}
class Bar {
public:
void receive(BarMessage& message));
// other messages
}
并模拟接收这些消息的测试:
class Mock {
public:
MOCK_METHOD(void, receive, (FooMessage& arg));
MOCK_METHOD(void, receive, (BarMessage& arg));
// a lot other messages
}
我想把 Mock
变成模板,所以我不会在 Mock
中写一长串 MOCK_METHOD()
我会像这样创建模拟:
Mock<BarMessage,BazMessage> myMock;
并为我生成那些模拟方法。有可能实现吗?
原问题:
我有模拟 class 看起来像这样:
class foo
{
public:
MOCK_METHOD(void, foo, (bar& arg));
MOCK_METHOD(void, foo, (bar& arg));
// other overloads
}
是否可以使用模板参数包创建这些模拟方法?我想做这样的事情:
template <typename...Ts>
class foo
{
public:
template <Ts...t>
MOCK_METHOD(void, foo, (t& arg))...;
}
不,这是不可能的,至少不是您在上面使用可变参数模板勾勒出的方式。 gMock
基于 C++ 中的宏,这些宏在编译前由预处理器扩展,因此在考虑可变参数宏之前。
您实现这样的目标的唯一机会是编写您自己的类似于 this which iterates over the elements of a variadic macro or using the Boost Preprocessor library that contains powerful macros such as BOOST_PP_SEQ_FOR_EACH
的 宏 。使用后者,您可以定义一个带有参数的宏
#define RECEIVE_MOCK_METHOD(R, DATA, ELEM) MOCK_METHOD(void, receive, (ELEM& arg));
然后用 Boost 预处理器调用它,比如
BOOST_PP_SEQ_FOR_EACH(RECEIVE_MOCK_METHOD, , (FooMessage) (BarMessage) (BazMessage))
产生三个模拟方法
MOCK_METHOD(void, receive, (FooMessage& arg));
MOCK_METHOD(void, receive, (BarMessage& arg));
MOCK_METHOD(void, receive, (BazMessage& arg));
编辑: 我有 classes 接收消息:
class Foo {
public:
void receive(FooMessage& message));
// other messages
}
class Bar {
public:
void receive(BarMessage& message));
// other messages
}
并模拟接收这些消息的测试:
class Mock {
public:
MOCK_METHOD(void, receive, (FooMessage& arg));
MOCK_METHOD(void, receive, (BarMessage& arg));
// a lot other messages
}
我想把 Mock
变成模板,所以我不会在 Mock
中写一长串 MOCK_METHOD()
我会像这样创建模拟:
Mock<BarMessage,BazMessage> myMock;
并为我生成那些模拟方法。有可能实现吗?
原问题: 我有模拟 class 看起来像这样:
class foo
{
public:
MOCK_METHOD(void, foo, (bar& arg));
MOCK_METHOD(void, foo, (bar& arg));
// other overloads
}
是否可以使用模板参数包创建这些模拟方法?我想做这样的事情:
template <typename...Ts>
class foo
{
public:
template <Ts...t>
MOCK_METHOD(void, foo, (t& arg))...;
}
不,这是不可能的,至少不是您在上面使用可变参数模板勾勒出的方式。 gMock
基于 C++ 中的宏,这些宏在编译前由预处理器扩展,因此在考虑可变参数宏之前。
您实现这样的目标的唯一机会是编写您自己的类似于 this which iterates over the elements of a variadic macro or using the Boost Preprocessor library that contains powerful macros such as BOOST_PP_SEQ_FOR_EACH
的 宏 。使用后者,您可以定义一个带有参数的宏
#define RECEIVE_MOCK_METHOD(R, DATA, ELEM) MOCK_METHOD(void, receive, (ELEM& arg));
然后用 Boost 预处理器调用它,比如
BOOST_PP_SEQ_FOR_EACH(RECEIVE_MOCK_METHOD, , (FooMessage) (BarMessage) (BazMessage))
产生三个模拟方法
MOCK_METHOD(void, receive, (FooMessage& arg));
MOCK_METHOD(void, receive, (BarMessage& arg));
MOCK_METHOD(void, receive, (BazMessage& arg));