C++ GMock在使用ReturnArg时删除隐式转换警告

C++ GMock在使用ReturnArg时删除隐式转换警告,c++,visual-studio,visual-c++,googletest,googlemock,C++,Visual Studio,Visual C++,Googletest,Googlemock,给定以下模拟方法 MOCK_METHOD2(send, int(const void* pBuffer, size_t szBuffer)); 以及以下用法 EXPECT_CALL(socketMock, send(_, _)) .Times(1) .WillOnce(ReturnArg<1>()); EXPECT_调用(socketMock,send(u,u)) .次(1) .WillOnce(ReturnArg()); 由于szBuffer隐式转换为int返

给定以下模拟方法

MOCK_METHOD2(send, int(const void* pBuffer, size_t szBuffer));
以及以下用法

EXPECT_CALL(socketMock, send(_, _))
    .Times(1)
    .WillOnce(ReturnArg<1>());
EXPECT_调用(socketMock,send(u,u))
.次(1)
.WillOnce(ReturnArg());
由于szBuffer隐式转换为int返回类型,将在ReturnArg中生成警告

下面是一个代码示例:

#include <cstddef>
#include <cstdint>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

class ISocket {
public:
    virtual int Send(const uint8_t* payload, const std::size_t payloadLength, std::size_t& sentLength) = 0;
};

class SocketMock : public ISocket {
public:
    MOCK_METHOD3(Send, int(const uint8_t*, const std::size_t, std::size_t&));
};

class MySender
{
public:
    static void Ping(ISocket& socket)
    {
        std::size_t bytesSent;
        uint8_t payload[64];
        memset(payload, 0, sizeof(payload));

        socket.Send(payload, sizeof(payload), bytesSent);

        if (bytesSent != sizeof(payload))
            throw std::runtime_error("Socket transmission failed");
    }
};

TEST(SocketSend, ReturnsBytesTransmitted)
{
    SocketMock socket;

    EXPECT_CALL(socket,
        Send(
            ::testing::_, // payload
            ::testing::_, // payload length
            ::testing::_  // return by param, bytes sent
        )).Times(1)
        .WillOnce(::testing::ReturnArg<1>());

    MySender::Ping(socket);

    ::testing::Mock::VerifyAndClearExpectations(&socket);
}

GTEST_API_ int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
#包括
#包括
#包括
#包括
等舱{
公众:
虚拟int发送(const uint8_t*有效负载,const std::size\u t有效负载长度,std::size\u t&sentLength)=0;
};
SocketMock类:公共ISocket{
公众:
模拟方法3(发送,int(常量uint8\u t*,常量std::size\u t,std::size\u t&));
};
类MySender
{
公众:
静态空隙Ping(ISocket和插座)
{
标准:尺寸单位;
uint8_t有效载荷[64];
memset(有效载荷,0,sizeof(有效载荷));
socket.Send(有效载荷,sizeof(有效载荷),bytesent);
if(bytesSent!=sizeof(有效负载))
throw std::runtime_错误(“套接字传输失败”);
}
};
测试(SocketSend、returnsbytestransited)
{
插座模拟插座;
期望_调用(套接字,
发送(
::测试:://有效负载
::测试::。,//有效负载长度
::测试:://按参数返回,已发送字节
)).次(1)
.WillOnce(::testing::ReturnArg());
MySender::Ping(套接字);
::测试::模拟::验证和ClearExpections(&socket);
}
GTEST_API_uuint main(int argc,char**argv)
{
测试:InitGoogleTest(&argc,argv);
返回运行所有测试();
}
以下是编译器警告:

googletest\googlemock\include\gmock/gmock more actions.h(165):警告C4267:“返回”:从“size\t”转换为“int”,可能会丢失数据(编译源文件TestMain.cpp)

是否有任何方法可以让GMock使用静态转换来更改返回类型以消除类型转换警告?

ReturnArg
是一个Google模拟“action”(),它返回被模拟函数的
k
第个参数。由于在这种情况下,函数的返回类型为
int
,第一个参数的类型为
size\t
,因此会生成一个关于潜在变窄警告的警告

注入显式类型转换的最简单方法是编写自定义操作:

    ACTION_TEMPLATE(ReturnArgWithTypeCast,
        HAS_2_TEMPLATE_PARAMS(int, k, typename, return_type),
        AND_0_VALUE_PARAMS()) {
        return static_cast<return_type>(::testing::get<k>(args));
    }
ACTION\u模板(ReturnArgWithTypeCast,
有2个模板参数(int、k、typename、return\u type),
和_0_值_参数(){
返回静态_cast(::testing::get(args));
}
该操作可通过以下方式使用:

...
.WillOnce(ReturnArgWithTypeCast<1, int>())
。。。
.WillOnce(ReturnArgWithTypeCast())

您能否提供一个最小的可复制示例?我无法用以下代码复制它:@f9c69e9781fa194211448473495534,我已经用编译的示例代码更新了问题,并且出现了问题。我还添加了一个VisualStudio标签,因为我注意到我不清楚自己在什么环境下遇到了这个问题。我认为*nix和windows都会有类似的转换问题,尽管我没有在*nix上进行验证。