Попытка юнит-тестирования приватного метода обратного вызова класса.Обратный вызов регистрируется с помощью функции, которую я могу смоделировать, а затем с помощью EXPECT_CALL и SaveArg я могу перехватить функцию обратного вызова в тестовом члене std :: function и вызвать ее для целей тестирования.Это прекрасно работает.
Проблема начинается, когда сам метод обратного вызова принимает в качестве параметра std :: function.
Код продукции:
Частный метод обратного вызоваЯ пытаюсь проверить:
void
MyClass::callbackMethod(const Callback callback)
Обратный вызов, который берется в качестве параметра для callbackMethod:
typedef std::function< void(void) > Callback;
Открытая функция, в которой связан обратный вызов:
void
MyClass::initialize(const Callback callback)
{
m_SomeClass->registerCallback(std::bind(&MyClass::callbackMethod, this, callback));
}
Код теста:
Член класса Tets, в который я пытаюсь сохранить аргумент обратного вызова из функции регистра:
std::function< void(const Callback callback) > m_Callback;
Что здесь должно произойти:
EXPECT_CALL(*m_SomeClassMock, registerCallback(_))
.WillOnce(SaveArg< 0 >(&m_Callback));
Выдает следующую ошибку:
...
/usr/include/c++/6/functional:1999:2: note: candidate: template<class _Functor> std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(std::reference_wrapper<_Functor>) [with _Functor = _Functor; _Res = void; _ArgTypes = {std::function<void(void)>}]
operator=(reference_wrapper<_Functor> __f) noexcept
^~~~~~~~
/usr/include/c++/6/functional:1999:2: note: template argument deduction/substitution failed:
In file included from .../ext-cppunit-google-mock-dev/5/workspace/usr/include/gmock/gmock.h:65:0,
from .../SomeClassMock.hpp:15,
from .../MyTest.cpp:16:
.../gmock/gmock-more-actions.h:172:12: note: 'std::function<void(void)>' is not derived from 'std::reference_wrapper<_Tp>'
*pointer = ::testing::get<k>(args);
~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Не уверен, что причиной этой ошибки может быть тот факт, что в последней строке ошибки, вероятно, должно быть:
std::function<void(std::function<void(void)>)>
дает какую-то подсказку?