2017-02-16 78 views
4

我有一個類Foo存儲指向回調的指針。回調可以用方法InvokeCallback()調用。使用谷歌測試檢查回調

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; 

} 

怎麼可能測試(使用谷歌測試),該SomeCallback()物(在上述的情況下,20),具有特定的參數引用?

編輯:

我想出了一個非常難看的解決方案。測試通過,但新錯誤出現在末尾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

可能重複:http://stackoverflow.com/questions/8942330/google-mock-unit-testing-static-methods-c –

+0

@πάνταῥεῖ,我檢查了以前的問題,並沒有弄清楚如何將答案應用於獨立函數回調的情況。 – Konstantin

+0

你不能。 Google Mock界面需要一個類界面。 –

回答

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(); 
}