2012-07-03 150 views
5

我使用谷歌模擬,並想嘲笑繼承鏈是這樣的:如何嘲笑繼承鏈在C++與谷歌嘲笑

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

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

當模擬A,我需要模擬A1(); 當模擬B,我不得不嘲笑A1()和B1();當模擬C時,我必須模擬C1(),B1()和A1()。

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

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

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

但是,對於C類,我只關心新的擴展函數C1()。特別是當定義了太多的方法時,我不想模擬所有的父方法。但是,如果我沒有模擬從父代繼承的所有方法,我就不能實例化mockC類。

一種方法是要求從C和mockB都繼承mockC,但它需要C和mockB都是從B繼承的,但C-> B->繼承鏈是在第三方代碼中定義的,我不能更改。

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

有什麼好方法可以解決這個問題嗎?

+0

那麼A和B的所有虛擬方法都是純虛擬的? – Fraser

+0

Mock可以相互繼承(當然,不是循環的),所以你不必重寫所有的方法;看看接受的答案:[Mock Inheritance](http://stackoverflow.com/questions/5484906/can-a-mock-class-inherit-from-another-mock-class-in-googlemock) – dwanderson

+0

D'oh ,如果我一直閱讀關於第三方代碼的結尾,這會有所幫助。對於那個很抱歉! – dwanderson

回答

1

僅在繼承層次結構中爲最後一個類創建模擬。然後在需要層次結構中的任何類的所有測試中使用它。根據你的榜樣,你可以創建只mockC類:

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

然後把它傳遞給你需要測試依賴於一個Ç所有類。這似乎並不合邏輯。