c – 使用谷歌测试检查回调

我有一个类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泄漏的模拟对象在程序退出时发现.

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

转载注明原文:c – 使用谷歌测试检查回调 - 代码日志