如何检查谷歌模拟中作为空指针传递的字符串参数
How can I check a string parameter in googlemock that is passed as void pointer
我想模拟来自第三方库的免费 C 函数。我知道googlemock建议将这些函数包装为接口类中的方法。
一些 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 添加一些定义并针对 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));
相关文章:
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为函数定义符号不明确的指针参数
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 构造函数 (C++) 中的 char 指针参数存在问题
- 成员访问是否在空指针上定义C++?
- 如何为C++字符串分配空指针参数?
- 如何检查谷歌模拟中作为空指针传递的字符串参数
- 作为参数的无名称空指针
- 如何正确地将一个文本整数作为参数作为空指针进行传递,并使用其地址作为整数的实际值
- 空指针参数,传递缓冲区
- 函数参数中的空指针与对象
- 使用空指针终止变量参数列表
- 如何使函数不使用STL容器参数(类似于空指针)
- c++空指针参数作为c#的可选参数
- 调试断言失败(无效空指针)默认字符串参数
- 函数参数中的空指针