2012-01-13 33 views
10

Tôi đang sử dụng gmock trong dự án của mình và tôi gặp sự cố để đặt biến tham chiếu tùy chỉnh cho hàm giả. Giả sử tôi có một lớp học như sau:cách đặt biến tùy chỉnh trong gmock

class XXXClient { 
public: 
    void QueryXXX(const Request&, Response&); 
}; 

class XXXRunner { 
public: 
    void DoSomething(XXXClient&); 
}; 

Có một khách hàng Lớp XXXRunner :: DoSomething sử dụng XXXClient :: QueryXXX, và tôi muốn thử XXXClient để kiểm tra XXXRunner :: DoSomething.

Sự cố xảy ra khi tham số thứ hai của QueryXXX, đó là 'Phản hồi', không phải là giá trị trả lại, mà là biến tham chiếu, mà tôi điền một số dữ liệu vào Response trong XXXClient :: QueryXXX. Tôi muốn đặt dữ liệu tùy chỉnh cho Phản hồi để xác minh điều kiện khác của XXXRunner :: DoSomething.

Khung gmock có thể đặt giá trị trả về dự kiến, nhưng tôi không thể tìm cách đặt "biến trả về"?

Vậy Cách thực hiện như thế?

Trả lời

16

Trước tiên, hãy một lớp học giả XXXClient, chúng ta hãy đặt tên cho nó XXXClientMock như sau:

class XXXClientMock : public XXXClient 
{ 
public: 
    MOCK_METHOD2(QueryXXX, QueryResult (Request&, Response&)); 
}; 

Sau đó, sử GMock Action SetArgReferee để thiết lập các thông số tùy chỉnh, như sau:

TEST(XXXRunnerTC, SetArgRefereeDemo) 
{ 
    XXXCLientMock oMock; 

    // set the custom response object 
    Response oRsp; 
    oRsp.attr1 = “…”; 
    oRsp.attr2 = “any thing you like”; 

    // associate the oRsp with mock object QueryXXX function 
    EXPECT_CALL(oMock, QueryXXX(_, _)). 
     WillOnce(SetArgReferee<1>(oRsp)); 
    // OK all done 

    // call QueryXXX 
    XXXRunner oRunner; 
    QueryResult oRst = oRunner.DoSomething(oMock); 
    … 

    // use assertions to verity your expectation 
    EXPECT_EQ(“abcdefg”, oRst.attr1); 
    …… 
} 

Tóm tắt thông tin
GMock cung cấp một loạt các hành động để thuận tiện cho việc thử các chức năng, chẳng hạn như SetArgReferee để tham khảo hoặc giá trị, SetArgPointee cho con trỏ, Return cho trả lại, Invoke để gọi chức năng mô phỏng tùy chỉnh (với logic thử nghiệm đơn giản), bạn có thể xem here để biết thêm chi tiết.

Hãy tận hưởng nó :) Cảm ơn bạn

Các vấn đề liên quan