2017-07-25 57 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 
};