是否可以为参数包中的每个参数创建模拟方法?

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));

Try it here!