(gTest) вызов ложного метода из того же класса не распознается EXPECT_CALL - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь создать вспомогательный вызываемый объект, который будет использоваться вместо функтора в функции регистрации обратного вызова. Я хочу проверить, был ли вызван обратный вызов при изменении значения и содержит ли оно правильное значение. Проблема в том, что даже когда объект вызывается, test не распознает вызов функции и говорит, что функция не была вызвана.

template <typename T>
class CallbackFunctionMock
{
public:
    CallbackFunctionMock()          = default;
    virtual ~CallbackFunctionMock() = default;
    CallbackFunctionMock(const CallbackFunctionMock&)                   {};
    CallbackFunctionMock& operator=(const CallbackFunctionMock& other)  { return *this; }


    MOCK_METHOD1_T(MockFunctor, void(T));

    void operator()(T newValue)
    {
        std::cout << "------------------------------input value: " << newValue << std::endl;   
        std::cout << "------------------------------beforeCallback" << std::endl;
        MockFunctor(newValue);
        std::cout << "------------------------------afterCallback" << std::endl;
    }
};

Test выглядит так:

TEST_F(SpecificDeviceTest, TestName)
{
    CallbackFunctionMock<const int&> helper;
    m_specificDevice->SubscribeCallback(helper);
    std::cout << "------------------------------11111111111111111111111" << std::endl;
    EXPECT_CALL(helper, MockFunctor(10)).Times(1);
    std::cout << "------------------------------22222222222222222222222" << std::endl;
    m_specificDevice->UpdateValue(10); 
    std::cout << "------------------------------33333333333333333333333" << std::endl;
}

Я использую шаблон версия, потому что у нас есть несколько устройств, и все они используют разные типы.

Вывод после сборки проекта показывает:

1>[ RUN      ] SpecificDeviceTest.TestName
1>------------------------------11111111111111111111111
1>------------------------------22222222222222222222222
1>------------------------------input value: 10
1>------------------------------beforeCallback
1>------------------------------afterCallback
1>------------------------------33333333333333333333333
1>c:\path\to\some\tests\SpecificDeviceTest.cpp: error : Actual function call         
count doesn't match EXPECT_CALL(helper, MockFunctor(10))...
1>         Expected: to be called once
1>           Actual: never called - unsatisfied and active
1>[  FAILED  ] SpecificDeviceTest.TestName(1 ms)

EDIT1: @SM m_specifi c device - наш класс, который представляет реальный элемент. Определение для SubscribeCallback и UpdateState выглядит следующим образом:

void Device::SubscribeCallback( boost::signals2::signal<void(int)>::slot_type clbk)
{
       valueChangedSignal.connect(clbk);
}

auto Device::UpdateValue(const int& newValue) -> void
{
        valueChangedSignal(newValue);
}

, а valueChangedSignal является членом, объявленным как:

boost::signals2::signal<void(int)> valueChangedSignal;

EDIT2: оказывается, есть более быстрое и простое решение с использованием MockFunction, которое не требуются дополнительные объекты:

TEST_F(SpecificDeviceTest, TestName)
{
    MockFunction<void(const int&)> mock_function;
    EXPECT_CALL(mock_function, Call(10)).Times(1);

    m_specificDevice->SubscribeCallback(mock_function.AsStdFunction());
    m_specificDevice->UpdateValue(10); 
}
...