Я пытаюсь создать вспомогательный вызываемый объект, который будет использоваться вместо функтора в функции регистрации обратного вызова. Я хочу проверить, был ли вызван обратный вызов при изменении значения и содержит ли оно правильное значение. Проблема в том, что даже когда объект вызывается, 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);
}