使用 google 测试来检查回调
Using google test to check callbacks
我有一个 class 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*)>
and 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();
}
我有一个 class 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*)>
and 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();
}