Witam
Na internecie na jednym z forów Michael Harrington pokazuje jak zamockowac metode templejtową. Niestety w moim przypadku z jakiegoś powodu to nie działa. nie wiadomo też dlaczego, bo outputy z konsoli gcca wiadomo jakie są pomocne.
Tutaj kod:
HardwareTalker.hpp
#pragma once
//jakies includy
class HardwareTalker
{
public:
HardwareTalker();
virtual ~HardwareTalker();
template <typename TRequest>
bool send(const DPDMessage<TRequest> &req)
{
//implementacja
}
template <typename TRequest>
CRFCtrl_UDPToken sendAndWaitForResponse(const DPDMessage<TRequest> &req)
{
//implementacja
}
template <typename TRequest>
CRFCtrl_UDPToken sendAndWaitForResponse(const DPDMessage<TRequest> &req, const u32 timeout)
{
//implementacja
}
};
HardwareTalkerMock.hpp:
#pragma once
#include "gmock/gmock.h"
#include <DPDControl/HardwareTalker.hpp>
class HardwareTalkerTemplateWrknd : public HardwareTalker
{
public:
HardwareTalkerTemplateWrknd():HardwareTalker() {};
virtual ~HardwareTalkerTemplateWrknd() {};
template <typename TRequest>
bool send(const DPDMessage<TRequest> &req)
{
return HardwareTalker::send<TRequest>(req);
}
template <typename TRequest>
CRFCtrl_UDPToken sendAndWaitForResponse(const DPDMessage<TRequest> &req)
{
return HardwareTalker::sendAndWaitForResponse<TRequest>(req);
}
template <typename TRequest>
CRFCtrl_UDPToken sendAndWaitForResponse(const DPDMessage<TRequest> &req, const u32 timeout)
{
return HardwareTalker::sendAndWaitForResponse<TRequest>(req, timeout);
}
//TransmitON_OFFResponse
bool sendTransmitOnOff(const DPDMessage<TransmitON_OFFResponse> &req) { return false; }
CRFCtrl_UDPToken sendAndWaitForResponseTransmitOnOff(const DPDMessage<TransmitON_OFFResponse> &req) { return CRFCtrl_UDPToken(); }
CRFCtrl_UDPToken sendAndWaitForResponseTransmitOnOff(const DPDMessage<TransmitON_OFFResponse> &req, const u32 timeout) { return CRFCtrl_UDPToken(); }
};
class HardwareTalkerMock : public HardwareTalkerTemplateWrknd
{
public:
HardwareTalkerMock():HardwareTalkerTemplateWrknd() {};
~HardwareTalkerMock() {};
//TransmitON_OFFResponse
MOCK_METHOD1(sendTransmitOnOff, bool(const DPDMessage<TransmitON_OFFResponse>&));
MOCK_METHOD1(sendAndWaitForResponseTransmitOnOff, CRFCtrl_UDPToken(const DPDMessage<TransmitON_OFFResponse>&));
MOCK_METHOD2(sendAndWaitForResponseTransmitOnOff, CRFCtrl_UDPToken(const DPDMessage<TransmitON_OFFResponse>&, const u32));
};
HardwareTalkerMock.cpp
#include "HardwareTalkerMock.hpp"
template <>
bool HardwareTalkerTemplateWrknd::send<TransmitON_OFFResponse>(const DPDMessage<TransmitON_OFFResponse> &req)
{
return sendTransmitOnOff(req);
}
template <>
CRFCtrl_UDPToken HardwareTalkerTemplateWrknd::sendAndWaitForResponse<TransmitON_OFFResponse>(const DPDMessage<TransmitON_OFFResponse> &req)
{
return sendAndWaitForResponseTransmitOnOff(req);
}
template <>
CRFCtrl_UDPToken HardwareTalkerTemplateWrknd::sendAndWaitForResponse<TransmitON_OFFResponse>(const DPDMessage<TransmitON_OFFResponse> &req, const u32 timeout)
{
return sendAndWaitForResponseTransmitOnOff(req, timeout);
}
output z gcca sugeruje że coś mu nie pasuje w /gmock/gtest/gtest.h:
gmock/gtest/gtest.h:7782:60: error: invalid use of incomplete type âconst class DPDMessage<TransmitON_OFFResponse>â
Klasa DPDMessage to klasa templejtowa, ma konstruktor bezparametrowy i ogólnie kod się kompiluje tylko kod unit testów nie.