2014-06-18 44 views
1

我有一個類A在其構造函數中實例化類B的對象。我想用模擬對象B來測試A.用C++/Gmock在中間模擬

而且不,我無法將B的對象作爲參數傳遞。有沒有其他方法?

我看到一篇文章http://www.ibm.com/developerworks/library/j-mocktest/index.html,將「中間模擬」作爲一個有趣的話題,但那是在Java中。在C++中可能嗎?

class B {...}; 

class A { 
    private: 
    B* b; 

    public: 
    A() { 
     b = new B(); 
    } 
    ~A() {..} 
}; 

編輯:

一般而言,對象可以以一些其他方法來創建,點播。例如,

class A { 
    ... 
    int doSomething() { 
     // Create an object of class B 
     b = new B(); 
    } 
}; 
+0

您可以創建一個新的構造;把B做呢? –

+0

我可以,但這是對象在類中創建的示例之一。通常,可以按需創建對象,例如在方法中。但這是好的一點,讓我編輯一下這個問題,使其更加清晰。 – Sailesh

+2

聽起來像你需要工廠對象/函數 –

回答

1

您可以使用此給出代碼

class B { 
    public: 
    virtual std::string name() { return "B::name"; } 
    virtual ~B() {} 
}; 

class A { 
    private: 
    std::unique_ptr<B> b; 

    public: 
    A() {} 
    void createB() { 
     b.reset(new B); // you want to replace `new B` with something else right? 
    } 
    void print() { 
     std::cout << (b ? b->name() : std::string()) << std::endl; 
    } 
    ~A() {} 
}; 

與工廠函數工廠模式


class A { 
    private: 
    std::unique_ptr<B> b; 

    public: 
    std::function<std::unique_ptr<B>()> b_maker; 

    A() { 
     // default maker 
     b_maker = []{ return std::unique_ptr<B>(new B); }; 
    } 

    A(std::function<std::unique_ptr<B>()> func) { 
     b_maker = func; 
    } 

    void createB() { 
     b = b_maker(); 
    } 

    void print() { 
     std::cout << (b ? b->name() : std::string()) << std::endl; 
    } 
    ~A() {} 
}; 

創建默認B A是相同

A(); 

,現在你可以提供嘲笑B帶

A([]{return std::unique_ptr<B>{new MockedB};}); 

live demo


您還可以b_maker是一個全局變量,所以你不需要經過它(但我不建議去)


您可以用複雜的方式與AbstractBFactoryBFactoryMockBFactory,但開銷太大,看起來像Java ...

+0

看起來我不得不最終做這樣的事情。感謝代碼。 – Sailesh