c++ - 使用谷歌测试来检查回调

标签 c++ googletest googlemock

我有一个 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;

}

如何测试(使用 google 测试)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));

}

最佳答案

使用 std::function<void*(void*)> testing::MockFunction<void*(void*)> mock 这个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++ - 使用谷歌测试来检查回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42266638/

相关文章:

c++ - Class 2 has no member v 错误

c++ - 如何在 Xcode 中引用图像和其他对象以及将它们放置在何处?

c++ - 具有类型删除析构函数的 unique_ptr 不太有效(有警告)

c++ - 您如何在测试 gmock 下模拟属于该类的函数?

c++ - 谷歌测试比较指针数组的内容

c++ - 将 googlemock EXPECT_CALL 与 shared_ptr 一起使用?

c++ - 为什么编译器不识别 Google Mock 通配符?

c++ - 为什么允许悬挂引用?

c++ - QTestLib单元测试框架+Gmock(创建QTCPServer-Mock对象)

c++ - 为什么在堆栈对象和堆对象上使用 Times(n) 调用 gmock EXPECT_CALL 时会得到不同的结果?