【问题标题】:Google Mock : Setting argument in EXPECT_CALLGoogle Mock:在 EXPECT_CALL 中设置参数
【发布时间】:2016-05-20 15:03:12
【问题描述】:

我试图在 Google Mock 中设置一个类成员函数参数值,但我得到了构建错误,我根本不明白发生了什么。有没有人可以解释一下。

函数原型为:

virtual int recv( Socket socket
                , char *buffer
                , int bufferLength
                , int flags ) = 0;

我正在尝试使用:

TEST_F( IPV4SocketTests, Read_SockErr_ok )
{
    Mock_SocketAdaptor *adaptor = new Mock_SocketAdaptor;
    char *rcvBuffer = "testingRcvWorks";

    EXPECT_CALL( *adaptor, recv( testing::_, testing::_, testing::_, testing::_ ) )
    .WillRepeatedly( testing::DoAll(
        testing::SetArgPointee<1>( rcvBuffer ),
        testing::Return( strlen( rcvBuffer ) ) ) );

我得到的错误是关于 std::get 的转换。

【问题讨论】:

  • 你能粘贴准确的错误信息吗?是 std::get<:tuple::size_type>() 您遇到问题还是其他问题?
  • 其实testing::SetArgPointee&lt;1&gt;( rcvBuffer ) 应该达到什么目的?您传递的第二个/第一个参数只是测试::_,因此您无论如何都无法访问它。
  • @TomaszKaminski 我仍在尝试掌握 Mock 的这一部分,是 testing::_ 错了吗?
  • @TomaszKaminski “无法访问它”是什么意思? testing::_ 的使用表示该参数不会与某个值匹配,没有什么可以阻止 SetArgPointee 像 Paul 预期的那样工作。

标签: c++ unit-testing oop googletest googlemock


【解决方案1】:

问题在于rcvBuffer 是一个指针。这就是为什么在设置指针时必须取消引用它。这是您的EXPECT_CALL 的外观:

EXPECT_CALL( *adaptor, recv( testing::_, testing::_, testing::_, testing::_ ) )
    .WillRepeatedly( testing::DoAll(
        testing::SetArgPointee<1>( *rcvBuffer ),
        testing::Return( strlen( rcvBuffer ) ) ) );

编辑:

这是我在项目中用来模拟通过指针返回 char 数组的方法 用作论据。首先,您需要创建一个自定义操作,该操作将复制 缓冲区(在这种情况下你不能使用SetArrayArgument):

ACTION_TEMPLATE(SetArgNPointeeTo, HAS_1_TEMPLATE_PARAMS(unsigned, uIndex), AND_2_VALUE_PARAMS(pData, uiDataSize))
{
    std::memcpy(std::get<uIndex>(args), pData, uiDataSize);
}

然后,在测试中像这样使用它:

Mock_SocketAdaptor *adaptor = new Mock_SocketAdaptor;
char rcvBuffer[] = "testingRcvWorks";
size_t bufferSize = sizeof("testingRcvWorks");

EXPECT_CALL( *adaptor, recv( testing::_, testing::_, testing::_, testing::_ ) )
    .WillRepeatedly( testing::DoAll(
        SetArgNPointeeTo<0>(std::begin(rcvBuffer), bufferSize),
        testing::Return( strlen( rcvBuffer ) ) ) );

【讨论】:

  • *rcvBuffer 只返回第一个字符,例如而不是“testingRcvWorks”我得到“t”?它摆脱了构建错误;)
  • @PaulMorriss 对不起,我忘了使用SetArgPointee 只会给你的第一个字符。有关如何复制整个 char 数组的详细说明,请参阅我的更新答案。
  • @MarkoPopovic 不要道歉,你在帮忙。这绝对是一种享受,谢谢
猜你喜欢
  • 1970-01-01
  • 2013-07-24
  • 2018-03-09
  • 2017-10-17
  • 2016-04-25
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多