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));
}
生の関数ポインタが問題なく
std::function
に保存することができますので、しかし、あなたのデザインの機能は変更されません - もちろん、これは実装のわずかな変化が必要となります重複:http://stackoverflow.com/questions/8942330/google-mock-unit-testing-static-methods-c –@πάνταῥεῖ、私は前に質問をチェックし、答えをどのようにスタンドアロン関数コールバックのケース。 – Konstantin
できません。 Google Mockインターフェースにはクラスインターフェースが必要です。 –