GMock removing implicit conversion warning when using ReturnArg(使用ReturnArg时GMock正在删除隐式转换警告)
问题描述
给定以下模拟方法
MOCK_METHOD2(send, int(const void* pBuffer, size_t szBuffer));
和以下用法
EXPECT_CALL(socketMock, send(_, _))
    .Times(1)
    .WillOnce(ReturnArg<1>());
由于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();
}
以下是编译器警告:
googletestgooglemockincludegmock/gmock-more-actions.h(165):警告C4267:‘Return’:从‘SIZE_t’转换为‘INT’,可能会丢失数据(编译源文件TestMain.cpp)
是否有任何方法可以使GMock使用STATIC_CAST更改返回类型以消除类型转换警告?
推荐答案
ReturnArg<k>是一个Google模拟操作(reference),它返回被模拟函数的第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));
    }
可以这样使用该操作:
...
.WillOnce(ReturnArgWithTypeCast<1, int>())
                        这篇关于使用ReturnArg时GMock正在删除隐式转换警告的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用ReturnArg时GMock正在删除隐式转换警告
				
        
 
            
        基础教程推荐
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
 - 我有静态或动态 boost 库吗? 2021-01-01
 - 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
 - 在 C++ 中计算滚动/移动平均值 2021-01-01
 - 如何在 C++ 中初始化静态常量成员? 2022-01-01
 - 如何通过C程序打开命令提示符Cmd 2022-12-09
 - 如何检查GTK+3.0中的小部件类型? 2022-11-30
 - 这个宏可以转换成函数吗? 2022-01-01
 - 常量变量在标题中不起作用 2021-01-01
 - C++结构和函数声明。为什么它不能编译? 2022-11-07
 
    	
    	
    	
    	
    	
    	
    	
    	
						
						
						
						
						
				
				
				
				