2017-02-16 3 views
4

У меня есть класс Foo, который хранит указатель на обратный вызов. Обратный вызов может быть вызван методом InvokeCallback().Использование теста google для проверки обратных вызовов

void* SomeCallback(void* a) { 

    return (void*)(*(int*)a + 10); 

} 


class Foo { 

public: 

    typedef void* (*CallbackFunction)(void*); 

    SetCallback(CallbackFunction callback) { 
     this->callback = callback; 
    } 

    InvokeCallback() { 
     callback(20); 
    } 

private: 

    CallbackFunction callback; 

} 

Как можно проверить (с помощью теста Google), что SomeCallback() был вызван с определенным параметром (20 в вышеупомянутом случае)?

EDIT:

я придумал очень уродливыми ищут решения. Тесты пройдены, но новая ошибка появилась в конце ERROR: 1 leaked mock object found at program exit.

class MockCallbackClass { 
public: 
    MOCK_METHOD1(SomeCallback, void*(void*)); 
}; 

MockCallbackClass mock; // Nasty global variable 

void* __SomeOtherCallback(void* a) { 

    return mock.SomeCallback(a); 

} 

TEST(Callback, MockCallback) { 

    Foo foo; 
    foo.SetCallback(__SomeOtherCallback); 
    EXPECT_CALL(mock, SomeCallback((void*)10)).WillOnce(testing::Return((void*)20)); 

} 
+0

Возможные duplicate: http://stackoverflow.com/questions/8942330/google-mock-unit-testing-static-methods-c –

+0

@ πάντα ῥεῖ, я проверил вопрос раньше и не понял, как применить ответ на случай автономных обратных вызовов функции. – Konstantin

+0

Вы не можете. Для интерфейсов Mock M требуется интерфейс класса. –

ответ

2

Использование std::function<void*(void*)> и testing::MockFunction<void*(void*)> издеваться этот std::function. Конечно, это требует незначительных изменений в вашей реализации - но функциональность вашего дизайна не меняется, так как сырые указатели на функции могут быть сохранены в std::function без проблем:

class Foo { 
public: 

    using CallbackFunction = std::function<void*(void*)>; 
    // rest of this class is as it was 
}; 

И тест, как это:

class FooTest : public testing::Test { 
public: 

    using CallbackFunctionMock = testing::MockFunction<void*(void*)>; 
    CallbackFunctionMock callbackFunctionMock; 

    Foo objectUnderTest{[this](void* v) { return callbackFunctionMock.Call(v); }}; 
}; 
TEST_F(FooTest, shallCallbackBeCalledByInvoke) 
{ 
    int a = 40; 
    EXPECT_CALL(callbackFunctionMock, Call(reinterpret_cast<void*>(20)).WillOnce(Return((void*)(&a)); 
    objectUnderTest.InvokeCallback(); 
} 
Смежные вопросы