Edit: I have classes that receives messages:
class Foo {
public:
void receive(FooMessage& message));
// other messages
}
class Bar {
public:
void receive(BarMessage& message));
// other messages
}
and mock that test receiving those messages:
class Mock {
public:
MOCK_METHOD(void, receive, (FooMessage& arg));
MOCK_METHOD(void, receive, (BarMessage& arg));
// a lot other messages
}
I wanted to turn Mock
into template, so instead of writing long list of MOCK_METHOD()
in Mock
I would create mock like this:
Mock<BarMessage,BazMessage> myMock;
and have those mock methods generated for me. Is it possible to achieve?
Original question: I have mock class that looks like this:
class foo
{
public:
MOCK_METHOD(void, foo, (bar& arg));
MOCK_METHOD(void, foo, (bar& arg));
// other overloads
}
Is it possible to create those mock methods using template parameter pack? I'm looking to do something like this:
template <typename...Ts>
class foo
{
public:
template <Ts...t>
MOCK_METHOD(void, foo, (t& arg))...;
}
I managed to solve the problem by moving MOCK_METHODS to separate classes and using std::tuple in original class:
template<typename MessageType>
class SingleMessageTypeReceiver
{
public:
MOCK_METHOD(void, processMessage, (MessageType & e));
void subscribe(std::shared_ptr<MessageQueue> queue)
{
queue->template subscribeMessage<MessageType>(*this);
}
};
template<typename... MessageTypes> class MockMessageReceiver
{
public:
template<typename MessageType>
SingleMessageTypeReceiver<MessageType>& of()
{
return std::get<testutil::SingleMessageTypeReceiver<MessageType>>(receivers);
}
private:
std::tuple<SingleMessageTypeReceiver<MessageTypes>...> receivers;
};