2012-07-03 31 views
5

Tôi đang sử dụng google giả, và muốn thử một chuỗi thừa kế như thế này:Làm thế nào để chế nhạo chuỗi kế thừa trong C++ với google thử

class A 
{ 
    // virtual method A1(); 
} 
class B : public A 
{ 
    // virtual method B1(); 
} 

class C : public B 
{ 
    // virtual method C1(); 
} 

Khi giả A, tôi cần phải thử A1(); khi giả lập B, tôi phải giả lập cả A1() và B1(); khi giả sử C, tôi phải giả sử C1(), B1() và A1().

//Mock Definition 
class MockA : public A 
{ 
    // mockA1() 
} 

class MockB : public B 
{ 
    // mockA1() 
    // mockB1() 
} 

class MockC : public C 
{ 
    // mockA1() 
    // mockB1() 
    // mockC1() 
} 

Tuy nhiên, đối với lớp C, tôi chỉ quan tâm chức năng mở rộng mới C1(). Tôi không muốn thử tất cả các phương pháp cha mẹ của nó đặc biệt là khi có quá nhiều phương pháp được xác định. Nhưng, tôi không thể khởi tạo lớp mockC nếu tôi không giả lập tất cả các phương thức được thừa kế từ cha mẹ của nó.

Một cách là yêu cầu mockC kế thừa từ cả C và mockB, Tuy nhiên, nó yêu cầu cả thuần khiết C và mockB kế thừa từ B. nhưng chuỗi C-> B-> A được xác định trong mã của bên thứ ba mà tôi không thể thay đổi.

// I cannot change this to virtual inheritance 
class C : public virtual B 
{ 
    //method C1(); 
} 

class mockB : public virtual B 
{ 
    // mthod B1() 
} 

class mockC: public C, public mockB 
{ 
    // mock method C1(); 
} 

Có cách nào tốt để giải quyết vấn đề này không?

+0

Vì vậy, tất cả các phương pháp ảo của A và B là thuần ảo? – Fraser

+0

Mocks có thể kế thừa từ nhau (tốt, không tròn), vì vậy bạn sẽ không phải viết lại tất cả các phương pháp; xem câu trả lời được chấp nhận để: [Mock Inheritance] (http://stackoverflow.com/questions/5484906/can-a-mock-class-inherit-from-another-mock-class-in-googlemock) – dwanderson

+0

D'oh , nếu tôi đọc tất cả các cách để kết thúc, về mã của bên thứ ba. Xin lỗi vì điều đó! – dwanderson

Trả lời

1

Chỉ tạo mô hình cho lớp cuối cùng trong phân cấp thừa kế của bạn. Sau đó, sử dụng nó trong tất cả các bài kiểm tra cần bất kỳ lớp nào trong cấu trúc phân cấp. Theo ví dụ của bạn, bạn có thể tạo chỉ lớp mockC:

class MockC : public C { 
    // mockA1() 
    // mockB1() 
    // mockC1() 
} 

Sau đó vượt qua nó để mọi tầng lớp bạn cần phải kiểm tra mà phụ thuộc vào Một hoặc B hoặc C. Điều này sẽ không có vẻ vô lý.

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