2017-07-25 84 views
2

我正在为使用GoogleTestGoogleMock的C++类编写单元测试。我当前的代码看起来像下面:GoogleMock:如何验证输入参数w.r.t的调用次数?

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-

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

回答

0

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

首先,定义一个名为postfix全局变量:

static int postfix = 0; 

编写自定义matchers

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); 
} 

编写自定义action每个调用之后增加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 
};