使用 google 测试操作使 2 个指针指向同一地址

Make 2 pointer point to the same adress with google tests actions

我需要测试 g_ascii_strtoll 失败的情况并将两个指针设置为相同的值,将 errno 设置为 0 和 return 0(根据文档:“如果字符串转换失败,则 returned 为零,并且 endptr returns nptr(如果 endptr 为非 NULL)")(即使 output_str = NULL in我的情况)
我要测试的代码:

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, so you shouldn’t need to write your own duplicate tests. However, if you’ve found a bug in GLib and are testing that, please consider 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, g_ascii_strtoll(_,_,_))
            .WillOnce( DoAll(Invoke(ut_pointer_cpy), SetErrnoAndReturn(0,0))  );

您在 Invoke 中调用的函数必须与您模拟的函数具有相同的参数,或者使用 Unused keywork 代替(我没有测试此选项)。