如何检查作为 void 指针传递的 googlemock 中的字符串参数
How can I check a string parameter in googlemock that is passed as void pointer
我想模拟第 3 方库中的免费 C 函数。我知道 googlemock 建议将函数包装为接口中的方法 class.
一些 C 函数需要 void* 参数,其解释取决于上下文。在一个测试用例中,一个以 0 结尾的字符串用于 void* 参数。
在模拟对象中,我想检查字符串的内容,当它作为 void* 传输时。当我尝试使用 StrEq 检查字符串内容时,它不起作用:
error: no matching function for call to std::__cxx11::basic_string<char>::basic_string(void*&)
我不想将包装器中的数据类型从 void* 更改为 char* 来完成这项工作,因为通过此参数传递的数据也可以是其他类型。我该怎么做才能使用 googlemock 的参数匹配器检查 void* 指向的数据,最好是比较字符串是否相等?
代码。如果您为函数 Foo 和 link 添加一些针对 gmock_main.a 的定义,它将编译,除了上述错误。
#include <gmock/gmock.h>
// 3rd party library function, interpretation of arg depends on mode
extern "C" int Foo(void * arg, int mode);
// Interface class to 3rd party library functions
class cFunctionWrapper {
public:
virtual int foo(void * arg, int mode) { Foo(arg,mode); }
virtual ~cFunctionWrapper() {}
};
// Mock class to avoid actually calling 3rd party library during tests
class mockWrapper : public cFunctionWrapper {
public:
MOCK_METHOD2(foo, int(void * arg, int mode));
};
using ::testing::StrEq;
TEST(CFunctionClient, CallsFoo) {
mockWrapper m;
EXPECT_CALL(m, foo(StrEq("ExpectedString"),2));
char arg[] = "ExpectedString";
m.foo(arg, 2);
}
这有帮助:https://groups.google.com/forum/#!topic/googlemock/-zGadl0Qj1c
解决方案是编写我自己的参数匹配器来执行必要的转换:
MATCHER_P(StrEqVoidPointer, expected, "") {
return std::string(static_cast<char*>(arg)) == expected;
}
并用它代替 StrEq
EXPECT_CALL(m, foo(StrEqVoidPointer("ExpectedString"),2));
我想模拟第 3 方库中的免费 C 函数。我知道 googlemock 建议将函数包装为接口中的方法 class.
一些 C 函数需要 void* 参数,其解释取决于上下文。在一个测试用例中,一个以 0 结尾的字符串用于 void* 参数。
在模拟对象中,我想检查字符串的内容,当它作为 void* 传输时。当我尝试使用 StrEq 检查字符串内容时,它不起作用:
error: no matching function for call to std::__cxx11::basic_string<char>::basic_string(void*&)
我不想将包装器中的数据类型从 void* 更改为 char* 来完成这项工作,因为通过此参数传递的数据也可以是其他类型。我该怎么做才能使用 googlemock 的参数匹配器检查 void* 指向的数据,最好是比较字符串是否相等?
代码。如果您为函数 Foo 和 link 添加一些针对 gmock_main.a 的定义,它将编译,除了上述错误。
#include <gmock/gmock.h>
// 3rd party library function, interpretation of arg depends on mode
extern "C" int Foo(void * arg, int mode);
// Interface class to 3rd party library functions
class cFunctionWrapper {
public:
virtual int foo(void * arg, int mode) { Foo(arg,mode); }
virtual ~cFunctionWrapper() {}
};
// Mock class to avoid actually calling 3rd party library during tests
class mockWrapper : public cFunctionWrapper {
public:
MOCK_METHOD2(foo, int(void * arg, int mode));
};
using ::testing::StrEq;
TEST(CFunctionClient, CallsFoo) {
mockWrapper m;
EXPECT_CALL(m, foo(StrEq("ExpectedString"),2));
char arg[] = "ExpectedString";
m.foo(arg, 2);
}
这有帮助:https://groups.google.com/forum/#!topic/googlemock/-zGadl0Qj1c
解决方案是编写我自己的参数匹配器来执行必要的转换:
MATCHER_P(StrEqVoidPointer, expected, "") {
return std::string(static_cast<char*>(arg)) == expected;
}
并用它代替 StrEq
EXPECT_CALL(m, foo(StrEqVoidPointer("ExpectedString"),2));