GoogleMock:如何验证输入参数w.r.t调用次数?

时间:2017-07-25 03:15:57

标签: c++ unit-testing googletest googlemock

我正在使用GoogleTestGoogleMock为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 < / em>的

我知道如何验证固定值的参数,例如attempt_connect(StrEq("127.0.0.1"),Eq(30001)),但不知道如何验证从调用到调用的各种参数。

1 个答案:

答案 0 :(得分:0)

我找到了问题的解决方案,但可能不是最好的。

首先,定义一个名为class Product extends Eloquent { protected $table = 'products'; protected $primaryKey = 'product_id'; public $timestamps = false; } 的全局变量:

postfix

撰写自定义matchers

static int postfix = 0;

编写一个自定义action,在每次调用后增加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()