如何解决使用谷歌测试操作使 2 个指针指向同一地址
我需要测试 g_ascii_strtoll 失败并将两个指针设置为相同值的情况,将 errno 设置为 0 并返回 0(根据文档:“如果字符串转换失败,则为零返回,并且 endptr 返回 nptr(如果 endptr 为非 NULL)")(即使在我的情况下 output_str = NULL)
我要测试的代码:
gchar* output_ptr= NULL;
gchar* input_ptr= "f";
result = g_ascii_strtoll(input_ptr,&output_ptr,10);
我的 Google 测试片段:
const gchar* nptr;
EXPECT_CALL(mock_gstring,g_ascii_strtoll(_,_,_)).WillOnce( DoAll(SaveArg<0>(&nptr),SetArgReferee<1>((char)*nptr),SetErrnoAndReturn(0,0)) );
基本上,我只想执行 *output_ptr= (gchar *)input_ptr;
但使用 Google 测试操作,但我无法使其正常工作...
解决方法
我不知道你的情况是什么,所以这可能不相关,但这里有两点(这两点都没有真正回答你的 googlemock 问题,抱歉):
- 您可能会发现
g_ascii_string_to_unsigned()
比g_ascii_strtoll()
更易于使用。对于将整个字符串解析为整数的主要用例,它具有等效的功能。 - GLib 中的函数在 unit tests for GLib 中进行了测试,因此您无需编写自己的重复测试。但是,如果您发现 GLib 中的错误并正在对其进行测试,请考虑使用 reporting it upstream,以便每个人都能受益。
最后我使用 Invoke(f) 解决了这个问题。
所以,而不是:
const gchar* nptr;
EXPECT_CALL(mock_gstring,g_ascii_strtoll(_,_,_)).WillOnce( DoAll(SaveArg<0>(&nptr),SetArgReferee<1>((char)*nptr),SetErrnoAndReturn(0,0)) );
我这样做了:
void ut_pointer_cpy(const gchar *nptr,gchar **endptr,guint base){
*endptr= (gchar *)nptr;
}
EXPECT_CALL(mock_gstring,_))
.WillOnce( DoAll(Invoke(ut_pointer_cpy),0)) );
您在 Invoke
中调用的函数必须与您模拟的函数具有相同的参数,或者改用 Unused
键(我没有测试此选项)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。