GoogleMock:如何验证输入参数的调用次数?
GoogleMock: How to validate input parameters w.r.t number of invocations?
我正在使用GoogleTest和GoogleMock为C++类编写单元测试。我当前的代码如下所示:
MockNetConnector* connector = new MockNetConnector();
NetClient* client = new NetClient(connector);
TEST_F(NetClientTest, connect)
{
EXPECT_CALL(*connector, attempt_connect(_,_)).Times(3)
.WillOnce(Return(false))
.WillOnce(Return(false))
.WillOnce(Return(true));
std::string srv_list = "127.0.0.1:30001,127.0.0.2:30002,127.0.0.3:30003";
bool is_connected = client->connect(srv_list);
ASSERT_TRUE(is_connected);
}
如您所见,(*connector).attempt_connect(_,_)
当前不验证输入参数。现在我希望它在每次调用时验证输入,即输入应该是 (127.0.0.x, 3000 x( 用于调用x-th。
我知道如何验证固定值的参数,例如attempt_connect(StrEq("127.0.0.1"),Eq(30001))
,但不知道如何验证因调用而异的参数。
我找到了这个问题的解决方案,但也许不是最好的。
首先,定义一个名为postfix
的全局变量:
static int postfix = 0;
编写自定义匹配器:
MATCHER(ValidateIP, "")
{
std::string expected_ip = "127.0.0." + to_string(::ip_postfix);
return (expected_ip == arg);
}
MATCHER(ValidatePort, "")
{
int expected_port = 30000 + ::port_postfix;
return (expected_port == arg);
}
编写一个自定义操作,在每次调用后增加postfix
。
ACTION(IncreasePostfix)
{
::postfix++;
}
将匹配器应用于预期:
EXPECT_CALL(*connector, attempt_connect(ValidateIP(),ValidatePort())).Times(3)
.WillOnce(DoAll(IncreasePostfix(), Return(false)))
.WillOnce(DoAll(IncreasePostfix(), Return(false)))
.WillOnce(DoAll(IncreasePostfix(), Return(true)));
要使postfix
对每个测试单独生效,请在测试开始之前重置它们(即在NetClientTest::SetUp()
内部(
class NetClientTest : public testing::Test
{
virtual void SetUp() {
::postfix = 1;
}
// other methods
};
相关文章:
- 当对话框被接受时,如何用参数调用槽
- 使用用户定义的参数调用future/async并调用类方法
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 不允许运算符 const 参数调用 const 成员函数
- 为变量模板的每个参数调用模板函数
- 如何在窗口中使用注入的 dll 中的参数调用函数
- 按引用调用与按指针参数调用的差异 前递增和后递增
- 为什么使用不匹配的参数调用重载函数仍然有效
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 基于枚举参数调用专用模板方法
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 如何使用类模板参数来更改参数调用和函数签名?
- lambda 函数使用其参数作为模板参数调用模板函数
- Android:使用 c++ 中的 byte[] 参数调用 java 方法
- 使用不同的模板参数调用模板类的对象
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 是否可以基于类模板的参数调用类方法和全局方法
- 使用单独的参数调用"boost::process::system()"时,获取"execv
- C++大括号初始值设定项作为参数调用不同的构造函数,然后预期