jak zamockować metodę templejtową

0

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.h60: 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.

0

jezeli robisz cokolwiek z template'ami to nie rozbijaj ich na dwa pliki (można, ale jest to pewna rodzaju sztuczka...)
daj implementacje z cpp do pliku hpp mock i powinno sie kompilować

0

Problem już nieaktualny, problemem był brak pewnego include'a.

0
fasadin napisał(a):

jezeli robisz cokolwiek z template'ami to nie rozbijaj ich na dwa pliki (można, ale jest to pewna rodzaju sztuczka...)
daj implementacje z cpp do pliku hpp mock i powinno sie kompilować

o jakiej sztuczce piszesz? ;)

0
ciekawyCzlek napisał(a):
fasadin napisał(a):

jezeli robisz cokolwiek z template'ami to nie rozbijaj ich na dwa pliki (można, ale jest to pewna rodzaju sztuczka...)
daj implementacje z cpp do pliku hpp mock i powinno sie kompilować

o jakiej sztuczce piszesz? ;)

Dołączanie źródeł w nagłówku, aka #include "sourcefile.cpp"

0

IMO coś jest tu nie tak!
Mockuje się coś co jest wywoływane przez testowany kod.
Natomiast metody template w klasie mają naturę API testowanej klasy, czyli chcesz mockować coś co ma być testowane!

Możesz zapodać linka do tej dyskusji na forum, gdzie Michael Harrington wyjaśnia co i jak?

1 użytkowników online, w tym zalogowanych: 0, gości: 1