2017-02-16 64 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; 

} 

どのようSomeCallback()こと(上記の場合には20)の特定のパラメータで呼び出された(Googleの試験を使用して)テストすることができますか?

EDIT:

私は非常に醜い探して解決策を考え出しました。テストはパスされますが、新しいエラーは最後にERROR: 1 leaked mock object found at program exitに表示されます。このstd::functionを模擬する

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

生の関数ポインタが問題なくstd::functionに保存することができますので、しかし、あなたのデザインの機能は変更されません - もちろん、これは実装のわずかな変化が必要となります重複: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*)>

このような
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(); 
} 
関連する問題